jQuery wait for .then() 回调函数由 promise 对象完成



我有原生JavaScript的代码(我简化了它):

var finalArray = [];
for (var i; i < 3; i++) {
    var a = -1;  // set the default value
    var b = Math.random();
    ymaps.route(someArray[i]).then(function (res) {
        a = res.getCoordinates();     
    });
    finalArray.push([a, b]);
}
console.log(finalArray);

有一些名为 ymaps 的第三方框架,它有一个返回 promise 对象的方法route。问题情况是我需要等到 promise.then 回调函数完成,然后用函数 finalArray.push([a, b]); 继续主代码,或者更确切地说,同步异步进程。

我上面写的代码的结果是

[
    [-1, /*random*/],
    [-1, /*random*/],
    [-1, /*random*/]
]

但是不是-1 - 默认的var a值,而是必须存在一些复数数字(在promise.then回调函数中更改var a)。

你不能只是"继续使用主代码"。承诺是异步的,只有在您尝试在 finalArray.push([a, b]); 中使用 a 后,您的回调(分配 a )才会执行。请参阅为什么在函数内部修改变量后,我的变量保持不变?- 异步代码参考。

相反,您还需要将主代码放在回调中。对于所有三个循环生成的承诺的结果,您可以获得另一个承诺,请参阅将延迟数组传递给 $.when()。

function makePromise(a, b) {
    // scope necessary for closure
    return ymaps.route(someArray[i]).then(function(res) {
        a = res.getCoordinates();
        return [a, b];
    });
}
var promises = [];
for (var i; i < 3; i++)
    promises.push(makePromise(-1, Math.random()));
$.when.apply($, promises).then(function() {
    var finalArray = Array.prototype.slice.call(arguments);
    console.log(finalArray);
});

最新更新