等待函数完成执行

时间:2015-06-29 15:40:50

标签: javascript jquery promise jquery-deferred

我有以下内容:

function functionA() {
    var myVar = functionB();
    functionC(myVar);
}

时间,functionB需要回答,取决于用户输入。它可能是1秒,但也是10秒。所以functionC总是被调用一个未定义的值,因为functionB()还没有完成。所以我尝试了这个:

function functionA() {
    var def = $.Deferred();
    var myVar = functionB();
    def.resolve();
    $.when(def).done(function () {
        functionC(myVar);
    });
}

这也行不通。我在StackOverflow上看到了这个:javascript function wait until another function to finish 但是怎么能转移到我的问题上呢? 总结一下,functionA的执行需要停止,直到functionB()得到回答。感谢。

3 个答案:

答案 0 :(得分:0)

您可以更改functionB以返回延迟对象,然后您可以在异步处理程序中解析该对象,如下所示:

function functionA() {
    var deferred = functionB();
    $.when(deferred).done(functionC);
}

function functionB() {
    var deferred = $.Deferred();

    // do something async here...
    // asyncCallback() { 
    //     deferred.resolveWith(this, dataRetrieved);   
    // }

    return deferred;
}

function functionC(data) {
    console.log(data);
}

答案 1 :(得分:0)

将您的示例放在一个简单的对象中,您可以执行以下操作:

var myObject = {
    myProp: null,
    functionA: function () {
        this.functionB();
        var self = this;
        var i = setInterval(function () {
            if (self.myProp) {
                clearInterval(i);
                self.functionC();
            }
        }, 100);
    },
    functionB: function () {
        // ...
        this.myProp = 'user input';
    },
    functionC: function () {
        // ...
    }
};
myObject.functionA();

如果设置myProp,脚本将每0.1秒检查一次。如果是,则清除间隔并调用functionC

在这种情况下不需要jQuery。

答案 2 :(得分:-1)

您可以将functionC作为参数传递给functionB,如提及here

function functionA() {
   var myVar = functionB(callback);
   functionC(myVar);
}

function functionB(callback) {
   // does something ...
   if(callback && typeof(callback) === "function") {
      callback();
   }
}