【发布时间】:2016-07-19 20:58:57
【问题描述】:
参考https://stackoverflow.com/a/13951699/929894,我尝试在嵌套的ajax 循环中使用延迟对象。但是输出没有按预期返回。我已经在小提琴中更新了我的代码以供参考。 -https://jsfiddle.net/fewtalks/nvbp26sx/1/。
代码:
function main() {
var def = $.Deferred();
var requests = [];
for (var i = 0; i < 2; i++) {
requests.push(test(i));
}
$.when.apply($, requests).then(function() {
def.resolve();
});
return def.promise();
}
function test(x){
var def = $.Deferred();
test1(x).done(function(){
setTimeout(function(){ console.log('processed test item', x); def.resolve();}, 1000);
});
return def.promise();
}
function test1(items){
var _d = $.Deferred();
setTimeout(function(){
console.log('processed test1 item', items);
_d.resolve();
});
return _d.promise();
}
main().done(function(){ console.log('completed')});
代码包含一个执行循环的主函数。在每个循环中,都会执行一个子函数(测试)。在子函数(test) 内部调用另一个函数(test1)。子函数 test 和 test1 都有 AJAX 调用声明。对于 AJAX 调用,我使用了 setTimeout 属性。我期待像
这样的输出processed test1 item0
processed test item0
processed test1 item1
processed test item0
completed
对于每个循环,我希望函数作为 Test1() 然后 test(); 执行但是我得到的结果是
processed test1 item 0
processed test1 item 1
processed test item 0
processed test item 1
completed
在执行完 test1 之后,测试函数就被执行了。为什么函数没有为每个循环按顺序执行。
为另一个测试运行更新代码
function main(items) {
var items = items;
return items.reduce(function (p, index) {
return p.then(function () {
return test(index);
});
}, $.Deferred().resolve());
}
function test(x) {
var def = $.Deferred();
test1(x).done(function () {
setTimeout(function () {
log('processed test item', x);
def.resolve();
}, 1000);
});
return def.promise();
}
function test1(items) {
var _d = $.Deferred();
setTimeout(function () {
log('processed test1 item', items);
_d.resolve();
});
return _d.promise();
}
var items = [0, 1];
function test2(x) {
var _d = $.Deferred();
setTimeout(function () {
log('processed test2 item',x);
_d.resolve();
});
return _d.promise();
}
main([1,2]).done(function(data){test2(items);}).then(function () {
log('completed')
});
<script src="https://dl.dropboxusercontent.com/u/7909102/log.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
为什么在处理 test2 函数之前记录“完成”?
【问题讨论】:
-
请将您的代码直接粘贴到您的问题中。此处不允许仅依赖外部代码引用的问题,并且外部引用往往会更改或消失,从而使该问题无法作为将来对其他人的参考。
标签: jquery-deferred