【问题标题】:What's the JS syntax to call a native module that has a single Promise parameter?调用具有单个 Promise 参数的本机模块的 JS 语法是什么?
【发布时间】:2019-11-16 02:14:33
【问题描述】:

Java 签名声明为:

@ReactMethod
public void someMethod(@NonNull String aString, @NonNull final Promise promise);

在这种情况下,Javascript 会这样称呼它:

async someMethod() {
    try {
      var result = await MyModule.someMethod("Hello",)
      ...
    } catch (e) {
      console.error(e);
    }
  }

这行得通。

现在我有另一种方法,如下所示:

@ReactMethod
public void someOtherMethod(@NonNull final Promise promise);

我不能从 JS 调用它,因为它会抱怨(对于像我这样没有经验的 JS 开发人员来说,这些错误非常神秘)。我不期待成为一名熟练的 JS 开发人员,这是一个我需要帮助的小项目,但我不知道如何调用它。

我尝试过以下几种变化:

var result = await MyModule.someOtherMethod()
var result = await MyModule.someOtherMethod(,)
var result = await MyModule.someOtherMethod({})
... 

我看到的大多数示例要么使用Callback(不是Promise),要么总是方便地有多个参数,其中promise 是(按设计)最后一个参数。但是我找不到一个示例,其中的方法only 接受Promise。

可能是我不知道如何搜索...(?)

谢谢你启发我。

【问题讨论】:

  • 您能否也添加有问题的error 以及如何定义someOtherMethod 方法?
  • 除非方法实现本身处理这种情况,否则您必须将承诺作为第二个参数传递。一个主要原因是 javascript 中没有方法重载。
  • @AayushSharma 处理此类案件是什么意思?我的意思是,如果签名是someOtherMethod(Promise p),那么你不能像从JS那样调用它吗? (可以用不同的方式调用它吗?)还是有另一个参数来克服缺乏方法重载的问题? (意味着我不能拥有methodA(int x, Promise p)methodB(int y, Promise p)?)
  • @CodeManiac 错误是 JS 语法错误或类似错误,老实说,这一切都隐藏在我每次调用它的尝试中,但是整个 react-native JS 代码在我尝试使用 -incorrect 时爆炸了- 句法。方法定义在问题中,这是伪代码,它们看起来像那样。
  • @MartinMarconcini 我确实为实现处理参数顺序的情况创建了一个jsFiddle。 javascript 中没有重载,也没有静态类型,因此实现必须在 javascript 中处理这种情况。否则,javascript中的参数顺序很重要,如果在实现中没有处理这种情况,它必须是第二个参数。

标签: javascript java react-native promise


【解决方案1】:

我正在投票结束这个,但如果它没有通过,以备将来参考,预期语法:

await module.someMethod()

在调用签名看起来像这样的@ReactMethod 方法时起作用

void someMethod(@NonNull Promise p);

我不知道我做了什么黑魔法(*),但现在它起作用了。

(*) 在大多数情况下,我注意到在使用 react-native 时,杀死“metro”服务器并使用react-native start --reset-cache 重新启动它然后再次运行应用程序通常很有用。这使得我原本非编译/运行的项目最终在其他解决方案不起作用时多次编译/运行正常。

在我使用 react-native 期间,我也执行了几次这个命令,因为它确实修复了我做某些事情时出现的许多编译错误(不确定是哪个)。

mkdir -p android/app/src/main/assets && rm -rf android/app/build && react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

之后,正常的react-native run-android 通常可以工作(或从 Android Studio 运行)。

从那里(并且在使用带有 Vysor 的真实设备时),我通过在命令行中发出“重新加载”菜单和其他内容:

adb shell input keyevent 82

感谢您的帮助,并希望这能为其他人指明正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多