Javascript 等待多个异步函数完成后再执行

Javascript 等待多个异步函数完成后再执行,javascript,asynchronous,Javascript,Asynchronous,我有一个Javascript for循环,它运行在一组数据库记录(已经提取)中 我想知道所有后续异步操作何时完成,但我似乎无法完成 对于每个记录,代码都运行许多函数,这些函数返回承诺,然后解析(然后触发另一个函数以获取更多信息,等等)。这一切都正常,但我不知道如何收集每个“FOR”迭代并检测何时处理了所有记录。基本上,我想使用一个“throbber”,并保留throbber,直到所有处理完成 代码如下(我删除了一些无关的信息) 和功能2 /////////////////////////////

我有一个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();
});