我有两个异步对象fn1和fn2,有时我想同步运行它们。

为简单起见,我以这种方式编写了代码:

var fn1 = function () {
    setTimeout(function () {
        console.log("fn1");
    },200);
};

var fn2 = function () {
    setTimeout(function () {
        console.log("fn2");
    },100);
};

fn1();
fn2();

但让我们假设不可能修改fn1和fn2对象。

仅在完成fn1执行后才运行fn2的最佳方法是什么?

最佳答案

如果要在f1()完成后执行f2(),请使用如下所述和所示的方法。

创建一个轮询函数,该函数检查由fn2方法创建的变量/属性更改。例:

function fn1(){/*...*/}
function fn2(){
    //Lots of code, including:
    window.someDynamicVar = "SPECIAL_token"; //Unique, only defined by this func
}
(function(){//Anonymous wrapper, don't leak variables
    var timer = window.setInterval(function(){
        //check whether an unique environment change has been made by fn2():
        if(window.someDynamicvar == "SPECIAL_token"){
            clearInterval(timer); //Clear the poller
            fn1(); //Call fn1
        }
    }, 200); //Poller interval 200ms
})();

该代码背后的概念是fn2()函数在执行期间/之后更改变量,这些变量可以读取。当检测到此类更改时,将清除轮询器,并执行fn1()

07-28 08:11