jQuery等待.then()回调函数由promise对象完成

时间:2015-04-23 14:19:43

标签: javascript jquery callback promise deferred

我有本机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>

1 个答案:

答案 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);
});