jQuery等待每个迭代完成两个单独的AJAX调用,然后再完成

时间:2020-10-12 23:07:32

标签: javascript jquery ajax

我整天都在为此苦苦挣扎,并且阅读了无数关于AJAX,延迟,承诺等的SO帖子。
每次进行的每一次更改,都保持不变:在所有AJAX调用完成之前,调用 generateLSRDetailRadiusMetrics 函数。 :-(

这就是我想要做的:

遍历数组,对于数组中的每个项目,我需要调用两(2)个AJAX函数。一旦数组中的所有项目都进行了两(2)个AJAX调用,我就需要等待所有未完成的调用完成,然后再继续下一步。

两个AJAX调用: promises.push(saveLayerCBG(radiusLayerObject,false))和promises.push(saveLayerPractices(radiusLayerObject,false))都返回诺言。如果我破坏了代码,我可以看到该数组确实包含了promises。

根据我正在阅读的内容(但不清楚地理解),我需要将promise添加到数组中,然后使用 $。when.apply($,promises).done 语法评估承诺的数组。

我在做什么错了?

这是我的主要代码:

function LSRRadiusMapProcessing(radiusMaps, newLSR, allRadiusLayers, lsrHeaderId, specialtyId) {
    return new Promise(function (resolve, reject) {
        const options = { steps: 64, units: 'miles' };
        let promises = [];
        for (let i = 0; i < radiusMaps.length; i++) { 
            promises.push(saveLayerCBG(radiusLayerObject, false));
            promises.push(saveLayerPractices(radiusLayerObject, false));
        }

        $.when.apply($, promises).done(function () {
            const lsrdetails = generateLSRDetailRadiusMetrics(lsrHeaderId, specialtyId);
            lsrdetails.then(function () {
                resolve(); 
            });
        });
    });
};

1 个答案:

答案 0 :(得分:0)

jQuery Deferred与Promise的“细微”区别如下:

$.when($.get(url1),$.get(url2))
 .then(function(){console.log(arguments[0][0]+arguments[1][0]);})

使用.when(),您可以将多个延期分组为一个普通组。然后,以下(jQuery-).then()将处理所有AJAX调用的结果。应该设置.then()中的回调函数,以期望与$.when()调用中的递延参数一样多的参数。在我的示例中,我仅使用回调函数中的arguments迭代器来访问所有参数。

// set up AJAX environment for testing:
// mirror data back as a JSON string (works only with GET):
function echoURL(data) {
  return URL.createObjectURL(new Blob([JSON.stringify(data)],{type: "text/json"}));
}
// two "URLS" returning different values (35 and 7)
const url1=echoURL(35), url2=echoURL(7);

//================================
//actual demo of jQuery deferreds:
//================================

$.when($.get(url1),$.get(url2))
 .then(function(){console.log("then:",arguments[0][0]+arguments[1][0]);})
 
 // it works just as well with .done():
 
 $.when($.get(url1),$.get(url2))
 .done(function(){console.log("done:",arguments[0][0]+arguments[1][0]);})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>