项目需要:H5 与安卓,IOS 交互,使用了第三方的 jsBridge, 因为使用了 js 来定义方法,OC 调用的模式(巨坑),
window.webkit.messageHandlers.XXXX 方法.postMessage(null);
function XXXX 方法(res){
//res 就是 OC 回调的参数,但是本地要等回调回来才能继续执行 js 方法,本地无法判断 OC 啥时候执行完 XXXX 方法
}
H5 必须要等 OC 执行完方法后,再执行回调,但是这种交互无法判断 OC 那边何时执行完, 求各位大神如何解决异步回调的问题
1
a87586179 OP 有前端大神不 TVT
|
2
Afishtail 2020-03-20 14:08:05 +08:00 1
```
let ocRes = false setTimeout(()=>{ ocRes = true },5000) // 模拟 5 秒后 OC 出结果 /** * * @param {*} interval 查询间隔 * @param {*} timeOut 超时时间 */ function checkOc(interval, timeOut) { return new Promise((resolve, reject) => { let timeConsum = 0 const timer = setInterval(() => { timeConsum += interval if (ocRes) { clearInterval(timer) resolve(`调用成功,耗时:${timeConsum}`) } else { if (timeConsum > timeOut) { clearInterval(timer) reject(new Error('调用超时')) } } }, interval) }) } checkOc(500, 6000).then(res => { console.log('正确', res) }).catch(err => { console.log('错误', err) }) ``` |
4
isRealLeven 2020-03-20 18:35:31 +08:00 1
OC 执行完方法后再执行下 js 的方法。
|
5
Torpedo 2020-03-20 18:38:04 +08:00 1
oc 成功就会调用你的回调,找个时间本身就是不可控的,等它回调你就好了
|
6
hstdt 2020-03-20 18:41:15 +08:00 via iPhone 1
oc 在处理完之后,再调用一下 js 的 function 呗
|
7
a87586179 OP @isRealLeven 问题在于,每个请求都得跟 OC 请求,同时多个请求回来就不知道回调的参数是哪个请求发出
|
8
ai277014717 2020-03-20 21:10:34 +08:00
js 调用的时候应该传给你 callback。自己存一下参数 hash 和 callback 的映射。你执行完了就调用一下 callback。
|
11
louiswang002 2020-03-20 21:45:15 +08:00
之前用过拦截 prompt 的方式做交互,可以尝试一下
|
12
Torpedo 2020-03-20 21:58:16 +08:00
@a87586179 看你问题是啥。回调太多,就是 promise 避免回调地域。分不出哪个是哪个,就是 8 楼的解决方法。说白了就是类似 jsonp 那种形式
|
13
Bijiabo 2020-03-20 22:18:58 +08:00
按照 8 楼的方式做比较方便,每次传给 OC 一个 callback 映射的 ID 就好
|