像这样读
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.然后回调