我有三个功能,我试图运行时,前两个是做一些异步的东西,需要的数据,第三使用。 我想在1和2都做了第三个功能只火。 这是一般的结构,但最终的功能之前1和2烧制光洁度。
function run() {
var data1 = {};
var data2 = {};
$.when(first(), second()).done(constructData());
function first() {
var d = new $.Deferred();
//do a bunch of stuff async
data1 = {};
d.resolve();
}
function second() {
var d = new $.Deferred();
//do a bunch of stuff async
data2 = {};
d.resolve();
}
function constructData() {
//do stuff with data1 and data2
}
}
答案是不会立即调用构造数据
$.when(first(), second()).done(constructData);
您应该返回承诺对象。 您还可以在此行中的错误:
$.when(first(), second()).done(constructData());
它应该是
$.when(first(), second()).done(constructData); // don't call constructData immediately
因此,所有的一起则可能是:
function run() {
var data1 = {};
var data2 = {};
$.when(first(), second()).done(constructData);
function first() {
return $.Deferred(function() { // <-- see returning Deferred object
var self = this;
setTimeout(function() { // <-- example of some async operation
data1 = {func: 'first', data: true};
self.resolve(); // <-- call resolve method once async is done
}, 2000);
});
}
function second() {
return $.Deferred(function() {
var self = this;
setTimeout(function() {
data2 = {func: 'second', data: true};
self.resolve();
}, 3000);
});
}
function constructData() {
//do stuff with data1 and data2
console.log(data1, data2);
}
}
http://jsfiddle.net/FwXZC/
我想你应该有first()
和second()
返回一个承诺: return d.promise();
。 从文档 :
如果一个参数传递给jQuery.when,这是不是一个延期或承诺,为解决延迟和连接任何doneCallbacks将立即执行将被处理。
我怀疑这可能是为什么when
呼叫呼叫constructData
太快。
很难从你的代码告诉,但要确保您所呼叫d.resolve()
的异步操作完成之后。
您可能会发现一个更自然的方式来明确设置data1
和data2
反而使用时所提供的数据resolve
被调用。 这意味着,你when
调用看起来是这样的:
$.when(first(), second()).done(function(result1, result2) {
data1 = result1[0];
data2 = result2[0];
constructData();
});
需要注意的是提供给结果的准确格式done
方法取决于延迟的对象的性质。 如果承诺从一个调用返回$.ajax
,结果应该是这样的形式[data, statusText, jqXhrObject]