从延迟的回调中返回承诺

时间:2013-10-11 14:03:41

标签: javascript jquery jquery-deferred

我正在研究一些任何东西,我真的想以一种好的方式实现它。

考虑以下代码

function getData(latency) {
    var deferred = $.Deferred();

    window.setTimeout(function () {
        deferred.resolve(Math.random());
    }, latency + 100);

    return deferred.promise();
}
function getSpecialData() {
    var deferreds = [];
    for (var i = 0; i < 3; i++) {
        deferreds.push(getData(1000 * i));
    }
    return $.when.apply($, deferreds);
}

function log(msg) {
    $("#console").append("<li>" + msg + "</li>");
    console.log(msg);
}

getData(3000)
.done(function () {
    log("got 3000 data");
    return getSpecialData()
    .done(function () {
        log("got special data");
    });
})
.always(function () {
    log("got all data");
});

如您所见,我从getData和getSpecialData函数中返回一个promise。我也以你看到的方式链接对这些功能的调用。更重要的是,我从getData完成的回调中返回一个promise。

我一直在期待延迟对象关心它的回调返回的内容以及它是否是一个承诺,等待该承诺解决然后另一个回调。实际发生的是它并不关心我在回调中返回的内容。订单是:

  1. 在3秒后调用getData获取"got 3000 data"信息,
  2. 同时使用always消息触发getSpecialData和"got all data"回调
  3. 我想要实现的是以下函数调用顺序:

    1. 在3s之后调用getData获取"got 3000 data"信息
    2. 调用getSpecialData,3s后获取"got special data"信息,
    3. "got all data"消息之后立即
    4. 让它按照我想要的方式工作的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

这正是.then()(或jQuery 1.8之前的.pipe())所做的。

拨打该号码,而不是.done()

答案 1 :(得分:0)

你不能return来自回调的任何东西,因为那是没有意义的 - 结果不会在调用者的任何地方使用,它的类型实际上是void

要进行连锁操作,您可以使用then代替done。该方法将为回调的(异步)结果返回一个promise,它本身就是一个promise。

相关问题