V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
a87586179
V2EX  ›  问与答

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

  •  
  •   a87586179 · 2020-03-20 10:48:53 +08:00 · 1641 次点击
    这是一个创建于 1715 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    function XXXX 方法(res){

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

    }

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

    13 条回复    2020-03-20 22:18:58 +08:00
    a87586179
        1
    a87586179  
    OP
       2020-03-20 10:55:47 +08:00
    有前端大神不 TVT
    Afishtail
        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)
    })
    ```
    a87586179
        3
    a87586179  
    OP
       2020-03-20 16:06:56 +08:00
    @Afishtail 我也有想过用定时器,但是感觉有点蛋疼,还是感谢大佬
    isRealLeven
        4
    isRealLeven  
       2020-03-20 18:35:31 +08:00   ❤️ 1
    OC 执行完方法后再执行下 js 的方法。
    Torpedo
        5
    Torpedo  
       2020-03-20 18:38:04 +08:00   ❤️ 1
    oc 成功就会调用你的回调,找个时间本身就是不可控的,等它回调你就好了
    hstdt
        6
    hstdt  
       2020-03-20 18:41:15 +08:00 via iPhone   ❤️ 1
    oc 在处理完之后,再调用一下 js 的 function 呗
    a87586179
        7
    a87586179  
    OP
       2020-03-20 21:04:48 +08:00
    @isRealLeven 问题在于,每个请求都得跟 OC 请求,同时多个请求回来就不知道回调的参数是哪个请求发出
    ai277014717
        8
    ai277014717  
       2020-03-20 21:10:34 +08:00
    js 调用的时候应该传给你 callback。自己存一下参数 hash 和 callback 的映射。你执行完了就调用一下 callback。
    Torpedo
        9
    Torpedo  
       2020-03-20 21:11:41 +08:00
    @a87586179 封装成 promise。然后 promise.all 一下。要不然,就是个回调计数器,都返回了再执行
    a87586179
        10
    a87586179  
    OP
       2020-03-20 21:16:17 +08:00
    @Torpedo 这个方法我也想过,在尝试
    louiswang002
        11
    louiswang002  
       2020-03-20 21:45:15 +08:00
    之前用过拦截 prompt 的方式做交互,可以尝试一下
    Torpedo
        12
    Torpedo  
       2020-03-20 21:58:16 +08:00
    @a87586179 看你问题是啥。回调太多,就是 promise 避免回调地域。分不出哪个是哪个,就是 8 楼的解决方法。说白了就是类似 jsonp 那种形式
    Bijiabo
        13
    Bijiabo  
       2020-03-20 22:18:58 +08:00
    按照 8 楼的方式做比较方便,每次传给 OC 一个 callback 映射的 ID 就好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3504 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:42 · PVG 12:42 · LAX 20:42 · JFK 23:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.