前言
上一篇文章介绍了使用callback的方式来进行React native与Android之间的通信,本文将介绍第三种通信方式,即promise的方式。
Promise方式
看了上面的回调函数的使用,大家有没有发现上面的写法还有有一些繁琐的?OK , 当然原生模块还可以支持使用Promise,这样可以简化我们编写的代码。如果大家搭配使用ES2016标准的async/await的语法使用会更加好。如果被桥接的原生方法的最后一个参数是一个Promise对象,那么该JS方法会返回一个Promise对象。下面我们使用Promise对象来进行重构之前的回调函数方法。我们来看一下代码是怎么样实现的。本文的代码是基于上一篇文章中的项目代码示例。
1、原生模块中首先在MyModule类中添加被Rn调用的方法,代码如下:
@ReactMethod
public void callNativeByPromise(String msg, Promise promise){
Log.e("wfunny","called by promise");
// 1.处理业务逻辑...
String result = "处理结果:" + msg;
// 2.回调RN,即将处理结果返回给RN
promise.resolve(result);
}
2、React native端在index.android.js中添加调用原生的方法代码,本例子是通过点击文本触发的,代码如下:
render(){
return (
<View style = {myStyles.container}>
<Text style = {myStyles.welcome} onPress={this.callNative.bind(this)}>
当你点我的时候会调用原生方法,原生方法延迟3s后会向前端发送事件。
前端一直在监听该事件,如果收到,则给出alert提示! send 方式
</Text>
<Text style = {myStyles.welcome} onPress={this.callNativeByCallBack.bind(this,'callback send ok',null)}>
callback方式 交互方式!!!!
</Text>
<Text style = {myStyles.welcome} onPress={this.callNativePromise.bind(this,'promise send ok',null)}>
promise方式 交互方式!!!!
</Text>
<Text style = {myStyles.instructions}>
{this.state.content}
</Text>
</View>
);
}
callNativePromise(msg){
console.log("js called by promise");
NativeModules.MyModule.callNativeByPromise(msg).then(
(result) => {
this.setState({content:result});
}
).catch((error) =>{
console.log(error);
})
}
从以上代码可以看出,React native 中通过callNativePromise 方法调用原生模块中的callNativeByPromise方法,该方法最后一个参数有一个Promise对象,那么JS调用Native模块的方法就会返回一个Promise对象,咱们用这个对象来将原生处理完毕以后的结果给JS端。
三种交互方式的比较
1、RCTDeviceEventEmitter发送事件方式
优点:可任意时刻传递,Native主导控制。
缺点:要添加注册监听
2、Callback回调方式
优点:JS调用一次,Native返回一次,
缺点:CallBack为异步操作,返回时机不确定
3、Promise方式
优点:JS调用一次,Native返回一次
缺点:每次使用需要JS调用一次
至于使用哪种方式根据自己的业务需求来决定,个人觉得相对而言 发送事件的方式缺点相对小一些。
网友评论