【问题标题】:Confusing Swift type annotations for React Native PromisesReact Native Promises 的混淆 Swift 类型注释
【发布时间】:2015-11-29 05:51:18
【问题描述】:

我正在使用 React Native 并尝试编写一些通过蓝牙通信的本机代码。我对我需要使用的类型注释以使其工作感到困惑。有人可以解释为什么我必须在以下两个代码 sn-ps 中有“解析器”和“拒绝器”位吗?有没有办法在没有那些未使用的部分的情况下编写这个?

我的实现,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 位...

【问题讨论】:

标签: objective-c swift react-native


【解决方案1】:

需要解析器和拒绝调用才能让框架生成“承诺”。可以将 Promise 视为将来可用的值的占位符。当本机代码完成其工作并准备将结果传递回 JavaScript 领域时,将调用解析器。当原生端检测到错误时使用reject,并用于将错误从原生端报告到JavaScript 域。

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

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

  1. 回调(在本机中,这些回调的类型为 RCTResponseSenderBlock)在调用时会导致 JavaScript 函数使用传递的参数运行
  2. promises(类型为 RCTPromiseResolveBlock 和 RCTPromiseRejectBlock)在调用解析器时导致成功处理程序使用传递的参数运行,或者在调用拒绝时导致错误处理程序运行。

对于异步函数,您必须使用 Promise。

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

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

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

【讨论】:

  • 这提供了有关承诺的非常好的信息。@Bob9630
猜你喜欢
  • 2015-11-29
  • 2020-11-29
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2017-04-01
  • 2014-08-02
  • 2019-01-01
相关资源
最近更新 更多