React Native Promises的Swift类型注释令人困惑



我在玩React Native,并试图编写一些通过蓝牙通信的本地代码。我被我需要使用的类型注释弄糊涂了,这样它才能工作。有人能解释一下为什么我必须在下面的两个代码片段中使用"解析器"one_answers"拒绝器"吗?有没有一种方法可以在没有这些未使用的部分的情况下写这篇文章?

我的实现,MyAsyncModule.swift:

@objc(MyAsyncModule)
class MyAsyncModule: NSObject {
  @objc func echoAsync(
    input: NSNumber,
    resolver resolve: RCTPromiseResolveBlock,
    rejecter reject: RCTPromiseRejectBlock
  ) -> Void {
    resolve(input)
  }
}

从我的网桥文件MyAsyncModuleBridge.m

RCT_EXTERN_METHOD(echoAsync:
                 (nonnull NSNumber *)input
                  resolver:(RCTPromiseResolveBlock *)resolve
                  rejecter:(RCTPromiseRejectBlock *)reject
                 )

我来自脚本领域,所以类型对我来说是陌生的,但React Native拒绝识别我的echoAsync方法似乎太奇怪了,除非实现和桥接都包括resolverrejecter位。。。

需要解析器和拒绝调用才能让框架生成"promise"。承诺可以被认为是未来可用价值的占位符。当本机代码完成其工作并准备将结果传递回JavaScript区域时,就会调用解析器。当本机端检测到错误时,会使用reject,并用于将该错误从本机报告给JavaScriptland。

更深入地说,当JavaScript调用本机函数时,它不会像普通函数调用一样暂停并等待本机函数结束。相反,它只是继续执行下一行代码(请注意React Native如何阻止您为导出的函数设置返回值,这意味着它们明确地确保您不会尝试等待返回值)。

那么,原生代码是如何将结果报告回JavaScript的呢?有两种选择

  1. 回调(在本机中,它们的类型为RCTResponseSenderBlock),当被调用时,会导致JavaScript函数使用传递的参数运行
  2. promise(类型为RCTPromiseResolveBlock和RCTPromise RejectBlock),它会导致在调用解析器时使用传递的参数运行成功处理程序,或者在调用reject时运行错误处理程序

至于异步函数,您必须使用promise。

有关JavaScript承诺结账的更多信息:

http://www.html5rocks.com/en/tutorials/es6/promises/

https://facebook.github.io/react-native/docs/native-modules-ios.html#promises

最新更新