Jquery。使用 ajax 调用在 .each 循环之后调用函数
Jquery. Calling a function after .each loop with ajax calls
我已经在线搜索了几个小时,我知道我可能必须对延迟对象做一些事情,但我做不到。
首先,这是我的代码:
$('#uploadButton').on('click', function () {
//some preparation stuff (deleted)
var panels = boxesContainer.find('.panel');
var ajaxes = [];
$.each(panels, function (index, panel) {
//more preparation + declaration of variables
function getIdAndPrepareData() {
$.when(
$.ajax({
type: 'POST',
url: 'url',
data: {
'title': name
}
}))
.done(function (result, textStatus, jqXHR) {
if (result.success) {
var id = result.id;
} else {
getIdAndPrepareData();
}
console.log('Created Id: ' + id);
$.each(panelForms, function (index, form) {
var filesInput = //again, prep and vars
$.each($(filesInput)[0].files, function (index, file) {
var formData = new FormData();
formData.append('file', file);
//more stuff
ajaxes.push({
'formData': formData,
'file': file
});
});
});
}).fail(function () {
getIdAndPrepareData();
});
}
getIdAndPrepareData();
});
$.ajax().promise().done(function () {
console.log('bla bla bla');
});
});
所以,基本上,我正在遍历某些 DIV 的 (.panels) 并通过 ajax 为它们创建一个新的数据库实体。然后我准备在所有循环完成后通过 ajax 将数据发送到服务器。我需要在使用 ajax 的所有循环之后发送此数据,因为接下来的 ajax 调用(我计划在迭代 .panels 和准备数据之后进行)将创建另一个实体这将与为 .panel DIV 创建的实体相关(我将所有这些数据推送到 ajaxes 数组,并计划在字母上使用它)。
我在面板循环中使用 jQuerys 延迟对象,以获取新创建的面板 ID,并将其保存在 ajaxes 数组中。但我不知道如何在面板循环后执行任何代码。
我试图在最后( $.ajax().promise().done )为所有 ajax 调用做出承诺(我对这项技术还很陌生),但是id 好像不行有时 promise 中的 console.log 会在最后触发,有时会在开头触发。
我不是 jQuery 和 JS 方面的专家,所以我想请教一些解释如何在循环内使用异步 ajax 调用以及在这种情况下我应该怎么做?我想在所有数据准备好之后执行一些代码。
谢谢。
您将使用 promises 数组获得答案,并使用针对 $.when
等的数组评估来评估它们,但是有一个方便的快捷方式,您可以链接 $.when
调用,而开销很小:
伪代码如下:
var promise; // undefined is a resolved promise to $.when
for (items in a loop){
promise = $.when(promise, $.ajax({...});
}
promise.done(function(){
// All done
});
备注:
$.ajax
returns一个承诺。该承诺是在完成数据或错误时给您回电。
$.when
当多个 promise 完成时(或任何失败时)回调你
如果您使用现有承诺和新承诺调用 $.when
,您会得到第三个承诺,当两者都完成时,该承诺将完成。这些可以按顺序链接在一起。
- 此快捷方式的缺点是传递给 done 的最终数据值比根据
done
. 对承诺数组的正常评估所预期的更复杂
当我只需要知道整体完成情况而不是所有个人 data/results 时,我优先使用这种技术而不是承诺数组。它使代码简单得多,额外承诺的开销也很小。它也适用于动画集。
我已经在线搜索了几个小时,我知道我可能必须对延迟对象做一些事情,但我做不到。
首先,这是我的代码:
$('#uploadButton').on('click', function () {
//some preparation stuff (deleted)
var panels = boxesContainer.find('.panel');
var ajaxes = [];
$.each(panels, function (index, panel) {
//more preparation + declaration of variables
function getIdAndPrepareData() {
$.when(
$.ajax({
type: 'POST',
url: 'url',
data: {
'title': name
}
}))
.done(function (result, textStatus, jqXHR) {
if (result.success) {
var id = result.id;
} else {
getIdAndPrepareData();
}
console.log('Created Id: ' + id);
$.each(panelForms, function (index, form) {
var filesInput = //again, prep and vars
$.each($(filesInput)[0].files, function (index, file) {
var formData = new FormData();
formData.append('file', file);
//more stuff
ajaxes.push({
'formData': formData,
'file': file
});
});
});
}).fail(function () {
getIdAndPrepareData();
});
}
getIdAndPrepareData();
});
$.ajax().promise().done(function () {
console.log('bla bla bla');
});
});
所以,基本上,我正在遍历某些 DIV 的 (.panels) 并通过 ajax 为它们创建一个新的数据库实体。然后我准备在所有循环完成后通过 ajax 将数据发送到服务器。我需要在使用 ajax 的所有循环之后发送此数据,因为接下来的 ajax 调用(我计划在迭代 .panels 和准备数据之后进行)将创建另一个实体这将与为 .panel DIV 创建的实体相关(我将所有这些数据推送到 ajaxes 数组,并计划在字母上使用它)。
我在面板循环中使用 jQuerys 延迟对象,以获取新创建的面板 ID,并将其保存在 ajaxes 数组中。但我不知道如何在面板循环后执行任何代码。
我试图在最后( $.ajax().promise().done )为所有 ajax 调用做出承诺(我对这项技术还很陌生),但是id 好像不行有时 promise 中的 console.log 会在最后触发,有时会在开头触发。
我不是 jQuery 和 JS 方面的专家,所以我想请教一些解释如何在循环内使用异步 ajax 调用以及在这种情况下我应该怎么做?我想在所有数据准备好之后执行一些代码。
谢谢。
您将使用 promises 数组获得答案,并使用针对 $.when
等的数组评估来评估它们,但是有一个方便的快捷方式,您可以链接 $.when
调用,而开销很小:
伪代码如下:
var promise; // undefined is a resolved promise to $.when
for (items in a loop){
promise = $.when(promise, $.ajax({...});
}
promise.done(function(){
// All done
});
备注:
$.ajax
returns一个承诺。该承诺是在完成数据或错误时给您回电。$.when
当多个 promise 完成时(或任何失败时)回调你如果您使用现有承诺和新承诺调用
$.when
,您会得到第三个承诺,当两者都完成时,该承诺将完成。这些可以按顺序链接在一起。- 此快捷方式的缺点是传递给 done 的最终数据值比根据
done
. 对承诺数组的正常评估所预期的更复杂
当我只需要知道整体完成情况而不是所有个人 data/results 时,我优先使用这种技术而不是承诺数组。它使代码简单得多,额外承诺的开销也很小。它也适用于动画集。