Javascript jQuery Deferred-在运行时将回调添加到延迟合约中
我需要的是向jQuery的.when()监视的函数添加未知数量的.pipe()调用(仅在运行时已知)。这些调用将基于另一个异步操作产生的ajax调用。请参阅下面的代码以获得更清楚的解释:Javascript jQuery Deferred-在运行时将回调添加到延迟合约中,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我需要的是向jQuery的.when()监视的函数添加未知数量的.pipe()调用(仅在运行时已知)。这些调用将基于另一个异步操作产生的ajax调用。请参阅下面的代码以获得更清楚的解释: $.when( $.ajax({ async: true, success: function (data, textStatus, jqXhr) { console.log('Level 1') for
$.when(
$.ajax({
async: true,
success: function (data, textStatus, jqXhr) {
console.log('Level 1')
for(var i = 0; i < data.length; i++)
jqXhr.pipe(
$.ajax({
data: data[i],
async: true,
success: function (data, textStatus, jqXhr) {
console.log('Level 2');
},
})
);
},
}),
$.ajax({
async: true,
success: function (data, textStatus, jqXhr) {
console.log('Level 3');
},
})
).done(function(){ console.log('All done!'); });
$。什么时候(
$.ajax({
async:true,
成功:函数(数据、文本状态、jqXhr){
console.log(“级别1”)
对于(变量i=0;i
基本上,1级和3级需要并行执行。2级均基于1级的结果。和级别1,所有级别2和级别3都需要在完成之前执行
使用上述代码不起作用,因为对.pipe()的调用不会影响.when()正在监视的内容
是否可以使用jQuery的延迟框架实现我想要的功能
谢谢你的帮助
注:之前,我问了一个非常类似的问题,但我意识到情况比我在那里说明的要复杂得多,我不想对现有的答案造成混淆
没有那么复杂。如果要并行执行所有级别2调用,只需调用
$。当.pipe
回调中的时,返回延迟对象:
$.when(
$.ajax({
// ...
}).pipe(function(data) {
// concise way to make the Ajax calls for each value
var deferreds = $.map(data, function(value) {
return $.ajax({data: value, /*...*/});
});
return $.when.apply($, deferreds);
}),
$.ajax({
// ...
})
).done(function(){ console.log('All done!'); });
如果要按顺序执行,请再次使用.pipe
:
$.when(
$.ajax({
// ...
}).pipe(function(data) {
// A "dummy" resolved deferred object
var deferred = (new $.Deferred()).resolve();
$.each(data, function(value) {
deferred = deferred.pipe(function() {
return $.ajax({data: value, /*...*/});
});
});
return deferred;
}),
$.ajax({
// ...
})
).done(function(){ console.log('All done!'); });
不过我不得不说,您应该将Ajax调用的数量控制在最低限度。没有那么复杂。如果要并行执行所有级别2调用,只需调用$。当.pipe
回调中的时,返回延迟对象:
$.when(
$.ajax({
// ...
}).pipe(function(data) {
// concise way to make the Ajax calls for each value
var deferreds = $.map(data, function(value) {
return $.ajax({data: value, /*...*/});
});
return $.when.apply($, deferreds);
}),
$.ajax({
// ...
})
).done(function(){ console.log('All done!'); });
如果要按顺序执行,请再次使用.pipe
:
$.when(
$.ajax({
// ...
}).pipe(function(data) {
// A "dummy" resolved deferred object
var deferred = (new $.Deferred()).resolve();
$.each(data, function(value) {
deferred = deferred.pipe(function() {
return $.ajax({data: value, /*...*/});
});
});
return deferred;
}),
$.ajax({
// ...
})
).done(function(){ console.log('All done!'); });
我不得不说,您应该将Ajax调用的数量保持在最低限度