【问题标题】:jQuery wait for .then() callback function is completed by promise objectjQuery等待.then()回调函数由promise对象完成
【发布时间】:2015-07-01 19:16:26
【问题描述】:

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

【问题讨论】:

  • 请添加您传递给.then()的回调函数的代码。没有看到就无法回答您的问题。
  • 最好看一下,这里是function(res){ a = res.getCoordinates(); }

标签: javascript jquery callback promise deferred


【解决方案1】:

您不能只“继续使用主代码”。 Promise 是异步的,只有在您尝试在 finalArray.push([a, b]); 中使用 a 后,才会执行您的回调(分配 a)。见Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

相反,您还需要将主代码放入回调中。对于所有三个循环生成的 Promise 的结果,您可以获得另一个 Promise,请参阅 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);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多