太棒了,我明白了,原来有一个名为 RCTResponseSenderBlock 的结构。我又做了一个
iOS 方法:
-(void)tmpMethod:(RCTResponseSenderBlock)callback{
[self.bridge.eventDispatcher sendAppEventWithName:@"channel" body:@{@"Block":callback}
] ;
}
javascript接收者:
EventEmitter.addListener("channel", async event => {
console.log(event)
event.Block(["Hello There"]);
return;
});
ios 方法调用:
[self tmpMethod:^(NSArray* response){
NSLog((NSString*)[response objectAtIndex:0]); //prints Hello There
}];
更新
事实证明,当我尝试为 Android 做同样的事情时,我做不到。 Android平台使用WriteableMap或WriteableArray发送事件,使用如下方法:
private void sendEvent(ReactContext reactContext,
String eventName,
@Nullable WritableMap params) {
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}
WriteableMap 和 WriteableArray 都不接受诸如回调之类的对象,这使得无法从 Javascript 端请求信息。我还尝试传入一个 Promise 而不是 WriteableMap 或 WriteableArray 并且引发了错误。要在 android 的同步上下文中进行异步通信,
- 我必须将事件从本机发送到 javascript
- 锁定两次以防止在本机端进一步执行
- 在我的 javascript 端,在查看带有请求数据的请求后,在我的本机端调用一个方法
- 在 javascript 调用的本机方法中解锁
- 程序解锁后继续执行
- 处理完需要同步处理的任何内容后,再解锁一次。 (如果你想要我的代码实现,请评论)
再次编辑:
上述流程不起作用。由于 ReactNative 始终使用主线程,因此我无法控制 Android 中的线程。因此,如果我最终锁定了主线程,那么 react-native 就无法进入另一种解锁方法,因此我遇到了死锁。因此无法强制与 android 同步交换数据。