function ajaxCall1(){
return $.ajax({
url : 'URL1',
data : { id : id },
type : 'GET',
});
}
function ajaxCall2(item_id)
{
return $.ajax({
url: 'URL2',
data: { item_id: item_id },
dataType: "text",
type: 'GET',
});
}
$.when(ajaxCall1()).done(function(columns){
$.each(columns, function(column, rows) {
$.each(rows, function(i, row) {
$.each(row.items, function(i, item) {
$.when(ajaxCall2(item.id)).done(function(count){
item.counter = count;
});
console.log(item);
});
});
});
});
我需要从调用item中获取一个新对象{counter:count}
,该对象是对象row
的嵌套部分。我不知道如何将对象从$.when...});
答案 0 :(得分:1)
这是你需要的:
ajaxCall1().done(function(columns){ // do first ajax
var promiseArray =[]; // array for promises of subsequent ajax calls
$.each(columns, function(column, rows) {
$.each(rows, function(i, row) {
$.each(row.items, function(i, item) {
// each call returns a promise...and also has it's own "done" to update count
var promise = ajaxCall2(item.id).done(function(count){
item.counter = count;
});
// push each promise returned from `$.ajax` into array
promiseArray .push(promise);
});
});
});
// all calls will be completed, can do something with main columns array
$.when.apply($, promiseArray).done(function(){
/// do something with columns
});
});
答案 1 :(得分:1)
您希望$.when
暂停执行直到完成,但事实并非如此。执行将在$.when
之后立即继续执行,并且只有在完成后才会执行回调。
如果要在完成所有ajax调用时进行回调,可以将它们添加到数组中,并在延迟数组上使用最终$.when
。
var deferreds = [];
$.when(ajaxCall1()).done(function(columns){
$.each(columns, function(column, rows) {
$.each(rows, function(i, row) {
$.each(row.items, function(i, item) {
var d = ajaxCall2(item.id);
deferreds.push(d);
$.when(d).done(function(count){
item.counter = count;
});
});
});
});
});
$.when.apply(null, deferreds).done(function(){
console.log( 'All ajax calls are done and each item should have a counter property' );
});