如何处理异步函数?

时间:2011-10-20 17:14:58

标签: javascript

我有两个异步对象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的最佳方法是什么?

6 个答案:

答案 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)

  1. fn1fn2不是对象
  2. 阅读setTimeout。完成后fn1致电fn2