我正在玩React Native,并尝试编写一些通过蓝牙进行通信的本机代码。为了使它能够工作,我对类型注释感到困惑。有人可以解释一下为什么下面两个代码段中必须有“ resolver”和“ rejecter”位吗?没有这些未使用的部分,有没有办法写这个?
我的实现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
)
我来自脚本领域,所以类型对我来说是陌生的,但是echoAsync
除非实现和桥都包括resolver
和rejecter
位,否则React Native拒绝识别我的方法似乎太奇怪了...
需要解析程序和拒绝调用,以使框架生成“承诺”。可以将诺言视为将来会提供的价值的占位符。当本机代码完成工作并准备好将结果传递回JavaScript领域时,将调用解析程序。当本机端检测到错误时,将使用reject,并用于将错误从本机报告到JavaScript。
更深入一点,当您使用JavaScript调用本机函数时,它不会暂停,并且像正常的函数调用一样等待本机完成。相反,它只是继续执行下一行代码(注意React-Native如何阻止您为导出的函数设置返回值,这意味着它们明确确保不要尝试等待返回值)。
那么,本机代码如何将结果报告回JavaScript?有两种选择
至于异步功能,您必须使用promise。
有关JavaScript承诺结帐的更多信息:
http://www.html5rocks.com/zh-CN/tutorials/es6/promises/
https://facebook.github.io/react-native/docs/native-modules-ios.html#promises
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句