Javascript 等待多个异步函数完成后再执行
我有一个Javascript for循环,它运行在一组数据库记录(已经提取)中 我想知道所有后续异步操作何时完成,但我似乎无法完成 对于每个记录,代码都运行许多函数,这些函数返回承诺,然后解析(然后触发另一个函数以获取更多信息,等等)。这一切都正常,但我不知道如何收集每个“FOR”迭代并检测何时处理了所有记录。基本上,我想使用一个“throbber”,并保留throbber,直到所有处理完成 代码如下(我删除了一些无关的信息) 和功能2Javascript 等待多个异步函数完成后再执行,javascript,asynchronous,Javascript,Asynchronous,我有一个Javascript for循环,它运行在一组数据库记录(已经提取)中 我想知道所有后续异步操作何时完成,但我似乎无法完成 对于每个记录,代码都运行许多函数,这些函数返回承诺,然后解析(然后触发另一个函数以获取更多信息,等等)。这一切都正常,但我不知道如何收集每个“FOR”迭代并检测何时处理了所有记录。基本上,我想使用一个“throbber”,并保留throbber,直到所有处理完成 代码如下(我删除了一些无关的信息) 和功能2 /////////////////////////////
///////////////////////////////////////////////////////////////
// Get record info for each array member
///////////////////////////////////////////////////////////////
function AVMI_getMultipleRecordInfoFromArray(ridList, AVMI_db, AVMI_recType) {
var promises = [];
var bigArray = [];
$.each(ridList, function (index,value) {
var def = new $.Deferred();
var thisArray = [];
$.get(AVMI_db, { //******* ITERATIVE AJAX CALL *******
act: 'API_GetRecordInfo',
rid: value
}).then(function(xml2) {
AVMI_throbberUpdate("Got " + AVMI_recType + " " + value + "...");
$(xml2).find('field').each(function() {
var $field = {};
$field.fid = $(this).find('fid').text();
$field.name = $(this).find('name').text();
$field.value = $(this).find('value').text();
thisArray.push($field);
});
thisArray = thisArray.sort(AVMI_ArrayComparator);
bigArray.push(thisArray);
def.resolve(bigArray);
});
promises.push(def);
});
return $.when.apply(undefined, promises).promise();
};
有没有关于如何构建这个的想法?我用$.Deferred做了各种各样的尝试,但我不太明白…您应该禁用ajax的async属性。默认情况下,它设置为true。这意味着您不必等待ajax响应。这就是为什么它返回未定义的值,并且必须将其设置为false。因此,您的代码将等待您的请求完成 所以你要做的就是
$.ajax({
url: '',
type: '',
async: false,
success: function(data){
}
});
您应该禁用ajax的async属性。默认情况下,它设置为true。这意味着您不必等待ajax响应。这就是为什么它返回未定义的值,并且必须将其设置为false。因此,您的代码将等待您的请求完成 所以你要做的就是
$.ajax({
url: '',
type: '',
async: false,
success: function(data){
}
});
您执行的操作与在
AVMI\u getmultipleRecordInfo fromArray
中执行的操作完全相同:收集数组中的承诺并使用$。当(或Promise.all
)时,等待这些承诺得到解决
您只需在此处使用.map
,它还可以处理以下问题:
您执行的操作与在AVMI\u getmultipleRecordInfo fromArray
中执行的操作完全相同:收集数组中的承诺并使用$。当(或Promise.all
)时,等待这些承诺得到解决
您只需在此处使用.map
,它还可以处理以下问题:
那是个坏主意。是否要冻结UI?正确的方法是使用延迟的对象/承诺。这是个坏主意。是否要冻结UI?正确的方法是使用延迟对象/承诺。您要寻找的是等待所有承诺解决或拒绝其中一个承诺的方法。您要寻找的是等待所有承诺解决或拒绝其中一个承诺的方法。
$.ajax({
url: '',
type: '',
async: false,
success: function(data){
}
});
var promises = systemArray.map(function(currRecord) {
// ...
return AVMI_getChildren(...).done(...);
});
$.when.apply(undefined, promises).done(function() {
AVMI_throbberClose();
});