我整天都在为此苦苦挣扎,并且阅读了无数关于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();
});
});
});
};
答案 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>