我有两个异步对象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()
。