我在玩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
方法似乎太奇怪了,除非实现和桥接都包括resolver
和rejecter
位。。。
需要解析器和拒绝调用才能让框架生成"promise"。承诺可以被认为是未来可用价值的占位符。当本机代码完成其工作并准备将结果传递回JavaScript区域时,就会调用解析器。当本机端检测到错误时,会使用reject,并用于将该错误从本机报告给JavaScriptland。
更深入地说,当JavaScript调用本机函数时,它不会像普通函数调用一样暂停并等待本机函数结束。相反,它只是继续执行下一行代码(请注意React Native如何阻止您为导出的函数设置返回值,这意味着它们明确地确保您不会尝试等待返回值)。
那么,原生代码是如何将结果报告回JavaScript的呢?有两种选择
- 回调(在本机中,它们的类型为RCTResponseSenderBlock),当被调用时,会导致JavaScript函数使用传递的参数运行
- 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