我有本机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
的第三方框架,它有一个方法route
,它返回一个 promise 对象。问题的情况我需要等到 promise.then 回调函数完成,然后继续使用函数finalArray.push([a, b]);
的主代码,或者更确切地说,同步异步进程。
我上面写的代码的结果是
[
[-1, /*random*/],
[-1, /*random*/],
[-1, /*random*/]
]
但不是-1
- 默认var a
值,而是 promise.then 回调函数中的一些复数(已更改var a
)必须在那里。< / p>
答案 0 :(得分:3)
你不能只是“继续使用主要代码”。 Promise是异步的,只有在您尝试在a
中使用a
后,您的回调(指定finalArray.push([a, b]);
)才会执行。请参阅Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference。
相反,您还需要将主代码放在回调中。您可以获得所有三个循环生成的承诺的结果的另一个承诺,请参阅Pass in an array of Deferreds to $.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);
});