【发布时间】:2015-09-26 11:14:58
【问题描述】:
在将其标记为重复之前,我查看了几篇关于 stackoverflow 的文章,但它们似乎没有回答我的问题。
我正在构建一个带有 api 的插件,该插件使用 http 请求进行调用。我有一个执行多次的主循环,其中包含多个不同的 AJAX 请求。完成所有请求后,我需要能够执行代码。
我遇到的主要问题是,在到达 $.when 函数时,包含所有承诺对象的数组要么为空,要么大部分为空,导致代码在一切完成之前触发。
这是基本的、简化的代码大纲:
var xhrs = [];
var xhr = null;
$.each(array, function(index, el) {
// Step 1
xhr = ajaxCall.success(function() {
xhr = ajaxCall2();
xhrs.push(xhr);
});
xhrs.push(xhr);
// Step 2
xhr = $.getJSON(params, function() {
//...stuff...
// Step 3
var xhrs2 = [];
$.each(function() {
xhr = ajaxCall3();
xhrs.push(xhr);
xhrs2.push(xhr);
});
// Step 4
xhr = ajaxCall4().success(function() {
xhr = ajaxCall5().success(function() {
//....
});
xhrs.push(xhr);
});
xhrs.push(xhr);
// Step 5
$.when(xhrs2).then(function() {
$.each(function() {
xhr = ajaxCall5();
xhrs.push(xhr);
});
});
});
xhrs.push(xhr);
});
$.when.apply($, xhrs).then(function() {
// Run when all ajax calls completed
});
我尝试将它移动到不同的位置,但没有成功。有什么想法吗?
【问题讨论】:
-
在这里看看 Promise 是如何工作的:learn.jquery.com/code-organization/deferreds/examples
-
停止将 Promise 推送到回调中的数组,并且不要对所有内容使用相同的变量名。
-
难道只计算请求的数量是行不通的,并且随着每个请求完成递增一个数字,然后执行 if
complete_requests == number_of_requests。我可能过于简化了。 -
@dartanian300 - 对于最近的一个项目,我最终基本上编写了一段代码来检查状态,并且在我达到等于数组长度的循环计数后,我知道它已经完成了并且然后,只有这样我才能前进到下一个功能。祝你好运
-
@Djave 不,我认为这不会起作用,因为它所使用的几乎所有东西都是一个可变数字,并且在几次 AJAX 调用之后我才能得到总数
标签: javascript jquery ajax promise