JS 与 OC 交互中异步回调的问题

2020-03-20 10:48:53 +08:00
 a87586179

项目需要:H5 与安卓,IOS 交互,使用了第三方的 jsBridge, 因为使用了 js 来定义方法,OC 调用的模式(巨坑),

window.webkit.messageHandlers.XXXX 方法.postMessage(null);

function XXXX 方法(res){

//res 就是 OC 回调的参数,但是本地要等回调回来才能继续执行 js 方法,本地无法判断 OC 啥时候执行完 XXXX 方法

}

H5 必须要等 OC 执行完方法后,再执行回调,但是这种交互无法判断 OC 那边何时执行完, 求各位大神如何解决异步回调的问题

1655 次点击
所在节点    问与答
13 条回复
a87586179
2020-03-20 10:55:47 +08:00
有前端大神不 TVT
Afishtail
2020-03-20 14:08:05 +08:00
```
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)
})
```
a87586179
2020-03-20 16:06:56 +08:00
@Afishtail 我也有想过用定时器,但是感觉有点蛋疼,还是感谢大佬
isRealLeven
2020-03-20 18:35:31 +08:00
OC 执行完方法后再执行下 js 的方法。
Torpedo
2020-03-20 18:38:04 +08:00
oc 成功就会调用你的回调,找个时间本身就是不可控的,等它回调你就好了
hstdt
2020-03-20 18:41:15 +08:00
oc 在处理完之后,再调用一下 js 的 function 呗
a87586179
2020-03-20 21:04:48 +08:00
@isRealLeven 问题在于,每个请求都得跟 OC 请求,同时多个请求回来就不知道回调的参数是哪个请求发出
ai277014717
2020-03-20 21:10:34 +08:00
js 调用的时候应该传给你 callback。自己存一下参数 hash 和 callback 的映射。你执行完了就调用一下 callback。
Torpedo
2020-03-20 21:11:41 +08:00
@a87586179 封装成 promise。然后 promise.all 一下。要不然,就是个回调计数器,都返回了再执行
a87586179
2020-03-20 21:16:17 +08:00
@Torpedo 这个方法我也想过,在尝试
louiswang002
2020-03-20 21:45:15 +08:00
之前用过拦截 prompt 的方式做交互,可以尝试一下
Torpedo
2020-03-20 21:58:16 +08:00
@a87586179 看你问题是啥。回调太多,就是 promise 避免回调地域。分不出哪个是哪个,就是 8 楼的解决方法。说白了就是类似 jsonp 那种形式
Bijiabo
2020-03-20 22:18:58 +08:00
按照 8 楼的方式做比较方便,每次传给 OC 一个 callback 映射的 ID 就好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654492

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX