ReactNative Promise Android端实现原理

ReactNative通过RNBridge调用原生模块。在一些情况下需要获取回调,RN提供了CallBack和Promise两种方式。

1
2
3
4
5
6
7
8
9
10
@ReactMethod
public void getPhoneModelByCallback(Callback result){
String model = Build.MODEL;
result.invoke(model);
}
@ReactMethod
public void getPhoneModelByPromise(Promise promise){
String model = Build.VERSION.MODEL;
promise.resolve(model);
}

查看源码:
Promise的实现类com.facebook.react.bridge.PromiseImpl

1
2
3
4
5
public class PromiseImpl implements Promise {
private @Nullable Callback mResolve;
private @Nullable Callback mReject;
...
}

可以看到Promise只是CallBack的包装,最终的调用路径与Callback方式相同。

1
2
3
CallbackImpl.invoke ->
CatalystInstanceImpl.invokeCallback ->
CatalystInstanceImpl.jniCallJSCallback

整个流程中,调用与回调之间的凭证为callbackId,在CallbackImpl构造方法中赋值。

为什么需要callbackId呢?什么是凭证?

看一个服务端分页请求的例子:

假设没有page参数,客户端同时发起两个网络请求,请求第一页和第二页数据时,服务端返回的成功失败、顺序都是未知的,返回的方法都是同一个。所以客户端也无法区分服务端返回的是第一页还是第二页数据。

这里page参数的作用就是callbackId的作用,作为通信的凭证。这种设计在JSSDK也有使用,非常常见。

以上。