我有原生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);
});