我试图调用一个函数,该函数循环遍历数据集,并根据来自异步函数的数据更新数据集中的值,显然我需要知道该函数何时完成循环和更新。
这是我目前拥有的:
function loadStationData() {
var $dfd = $.Deferred();
$.getJSON('../backend/navigation/get-stations.php', function(data) {
stationData = data;
$dfd.resolve();
});
return $dfd.promise();
}
function updateStationData() {
var $dfd = $.Deferred();
$.each(stationData, (i,v) => {
var $dfd2 = $.Deferred();
$.when(getFullCoordPack(v.lat, v.lng)).then(function(coords) {
delete v.lat;
delete v.lng;
v.coords = coords;
$dfd2.resolve();
});
return $dfd2.promise();
});
return $dfd.promise();
}
$.when(loadStationData(), updateStationData()).then(() => {
// do stuff
});
函数getFullCoordPack(v.lat, v.lng)
使用What3Words的API,因此包含 AJAX 调用,因此需要在完成时进行承诺。
然而,我很难理解如何在第二个函数中使用Deferred对象,需要一些关于如何最好地实现我的目标的建议。
1条答案
按热度按时间0yg35tkg1#
$.getJSON
已经返回了一个promise,因此不需要为它使用新的Deferred。在第二个函数中,没有解析
$dfd
的代码。然而,自ECMAScript 2015年以来,已经没有理由再使用jQuery Deferred了,现在promise在JavaScript中是原生的,还有
async
/await
语法和返回promise的API,比如fetch
。因此,类似下面的代码应该可以工作(假设
getFullCoordPack
返回一个promise对象):