我有两个异步对象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的最佳方法是什么?
答案 0 :(得分:4)
如果您想在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()
。
答案 1 :(得分:2)
“......我们假设无法修改fn1和fn2对象。”
如果不进行修改,它们将表现为异步函数的行为;它们将以异步方式运行。
如果您预先知道第一个函数的持续时间,则可以延迟执行第二个函数的持续时间。
f1();
setTimeout(f2,200);
答案 2 :(得分:1)
您应该使用回调函数。
http://recurial.com/programming/understanding-callback-functions-in-javascript/
var fn2 = function (myCallback) {
setTimeout(function () {
console.log("fn2");
myCallback();
},100); };
答案 3 :(得分:0)
在一般情况下,没有一个漂亮的方法。你确定你不能改变它们的功能,以便它们在完成后接收连续功能吗?
function f1(continuation){
setTimeout(function(){
console.log("f1");
continuation(); //kind of like a return...
}, 100);
}
function f2(continuation){
setTimeout(function(){
console.log("f2");
continuation();
}, 100);
}
f1(function(){
f2( function(){
console.log("this runs after f2 ends");
})
})
答案 4 :(得分:0)
fn1和fn2是大多数肯定对象,与下面(或上面)所说的相反,但这是一个不同的故事。做你想做的最简单的方法,它提供一个可选的回调参数。
var fn1 = function (callback) {
setTimeout(function () {
console.log("fn1");
if (callback) callback();
},200);
};
var fn2 = function (callback) {
setTimeout(function () {
console.log("fn2");
if (callback) callback();
},100);
};
所以而不是:
fn1();
fn2();
你会这样做:
fn1(fn2);
或明确说明:
fn1(function() {
fn2();
});
答案 5 :(得分:-3)
fn1
和fn2
不是对象setTimeout
。完成后fn1
致电fn2