js中如果遇到低版本安卓设备调用setTimeout不生效解决办法

摘要:工作中会遇到低版本安卓设备调用setTimeout不生效,既不会报错,里面的函数也不会执行,这里po一个解决办法,如果不执行则执行安卓自己封装的原生的setTimeout方法:sdk.setTimeout。

工作中会遇到低版本安卓设备调用setTimeout不生效,既不会报错,里面的函数也不会执行,这里po一个解决办法,如果不执行则执行安卓自己封装的原生的setTimeout方法:sdk.setTimeout。

注明:此方法为我们老大所写,放在这里惠存一下。

基本方案
/*******/
(function(window){
    Promise.race([
        new Promise((resolve)=>{
            window.setTimeout(()=>{
                resolve(window.setTimeout)
            },0)
        }),
        new Promise((resolve)=>{
            sdk.setTimeout(()=>{
                resolve(sdk.setTimeout.bind(sdk))
            },100)
        })
    ]).then((fn)=>{
        window.setTimeout = fn
    })
})(window)


window.setTimeout(()=>{
    cosole.log('hello world')
},1000)








进阶方案
/*******/

(function(window){
    const st = window.setTimeout.bind(window)
    let callList = []
    window.setTimeout = function(cb, duration){
        callList.push(cb)
        return st(cb, duration)
    }
    Promise.race([
        new Promise((resolve)=>{
            window.setTimeout(()=>{
                resolve(()=>{
                    return st
                })
            },0)
        }),
        new Promise((resolve)=>{
            sdk.setTimeout(()=>{
                resolve(()=>{
                    callList.forEach(fn=>{
                        sdk.setTimeout(fn, duration)
                    })
                    window.clearTimeout = sdk.clearTimeout.bind(sdk)
                    return sdk.setTimeout.bind(sdk)
                })
            },100)
        })
    ]).then((fn)=>{
        window.setTimeout = fn()
    })
})(window)

原文:https://www.cnblogs.com/beileixinqing/archive/2020/02/27/12373370.html


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_7954