像这样读
JSON-Service:
$.ajax({
url:'activeIDs',success : function(data){ // data = [14,15]
var tableRows = [];
for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
var isLast = dataIndex == (data.length - 1);
$.ajax({
url: 'info?id=' + data[dataIndex],success: function(data2) { // "foo","bar"
tableRows.push(data2.name);
if (isLast) {
alert(tableRows.length);
}
}
});
}
}
});
第一个网络跟踪是:
> activeIDs = [14,15]
> info?id = 14(需要2秒)=“foo”
> info?id = 15(需要4秒)=“bar”
在这种情况下,警报给出“2”.
秒网络跟踪是不同的:
> activeIDs = [14,15];
> info?id = 14(需要20秒)=“foo”(现在需要很长时间)
> info?id = 15(需要1秒)=“bar”
在这种情况下,警报在一秒钟后给出1,这很糟糕!
题:
如何使用$.Deferred而不是isLast?
解决方法
在发出警报之前,您需要等待所有请求完成.
$.ajax({
url:'activeIDs',15]
var tableRows = [];
var requests = [];
for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
var isLast = dataIndex == data.length;
var request = $.ajax({
url: 'info?id=' + data[dataIndex]
}).done(function(data2) { // "foo","bar"
tableRows.push(data2.name);
});
requests.push(request);
}
// wait for all requests to finish here
$.when(requests).then(function(){
// all success functions have been called and updated things appropriately
alert(tableRows.length);
}
}
});
这假设所有请求都成功.它看起来也有一些拼写错误
> tableRows在哪里更新?
>条目定义在哪里?
编辑现在使用promise样式成功处理程序.应该在调用$.when()之前将结果推送到tableRows.然后回调