【发布时间】:2015-08-27 17:28:08
【问题描述】:
我正在开发一个客户端 JS 应用程序,该应用程序应该读取 CSV 文件,每行进行几次 API 调用,然后将结果写回 CSV。我坚持的部分是如何编排请求并在所有完成后触发功能。这是我目前所拥有的:
var requests = [];
// loop through rows
addresses.forEach(function (address, i) {
// make request
var addressRequest = $.ajax({
dataType: 'json',
url: 'http://api.com/addresses/' + address,
success: function (data, textStatus, jqXhr) { APP.didGetAddressJson(data, i, jqXhr) },
error: function (jqXhr, textStatus, errorThrown) { APP.didFailToGetAddressJson(errorThrown, i) },
});
requests.push(addressRequest);
// make some more requests (handled by other success functions)
});
// leggo
$.when.apply($, requests).done(APP.didFinishGeocoding);
问题在于,如果其中一行抛出 404,则不会调用 done 函数。我将它切换到always,现在它被调用了,但不是在最后——如果我将每个回调的执行记录到控制台,它通常在中间的某个地方。但是,如果我编辑 CSV 所以没有错误,它会按预期在最后被调用。我是否在这里做了一些让always 提前触发的事情?
更新:难道只是控制台正在记录它out of order?
【问题讨论】:
-
中间是什么? AJAX 请求不一定按照它们发送的顺序完成。
-
forEach() 在 jQuery 上?
-
@Barmar 我的意思是如果我将每个回调记录到控制台。更新了问题。
-
阅读api.jquery.com/jquery.when 的段落,它解释了传递多个延迟对象时它是如何工作的。特别是:该方法将在所有 Deferred 解决后立即解决其 master Deferred,或者在其中一个 Deferred 被拒绝时立即拒绝 master Deferred。 所以
.done()在任何时候都会被调用的 AJAX 调用失败,否则当它们都成功时。
标签: javascript jquery jquery-deferred