我有以下内容:
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()得到回答。感谢。
答案 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();
}
}