【问题标题】:jQuery promises - reduce multiple $.when successful results to one?jQuery 承诺 - 将多个 $.when 成功结果减少为一个?
【发布时间】:2013-09-24 10:39:57
【问题描述】:

我目前使用的是 jQuery 1.9.1。

我正忙于链接两个 Promise,以便它们都在处理结果之前执行,但我只关心将第二个 Promise 的结果传递给调用者。

我的第一次尝试如下(也请忽略我没有处理错误案例):

function doSomething() {
    var firstPromise = $.Deferred(function(dfd) { dfd.resolve(1); }).promise();
    var secondPromise = $.Deferred(function(dfd) { dfd.resolve(2); }).promise();

    var grouped = $.when(firstPromise, secondPromise);

    grouped.then(function(firstResult, secondResult){
        return secondResult;
    });

    return grouped
}

doSomething.then(function(a, b) {
    console.log(arguments); // will be [1, 2], correspondingly a=1, b=2
});

但是可以看出,返回的不仅仅是第二个结果,而是两个结果。我最初认为,因为 group.then 只返回 secondResult,所以只有 this 会传递给调用者。

我的第二次尝试解决了这个问题,但需要使用另一个 deferred 来实现:

function doSomething() {
    var firstPromise = $.Deferred(function(dfd) { dfd.resolve(1); }).promise();
    var secondPromise = $.Deferred(function(dfd) { dfd.resolve(2); }).promise();

    var grouped = $.when(firstPromise, secondPromise);

    var promise = $.Deferred(function(dfd) {
        grouped.then(function(a, b) { 
            dfd.resolve(b);
        });
    }).promise();

    return promise;
}

doSomething().then(function(result) {
    console.log(result); // will be 2
});

在这里,我只是创建了一个新的 Promise,它只使用分组 Promise 的第二个结果来解决,然后返回该 Promise。

这一切都很好,但是否有更简单的方法来使用 jQuery Promise 做到这一点?

【问题讨论】:

    标签: jquery promise chaining


    【解决方案1】:

    您的问题出在return grouped 行(在第一个代码示例中)。

    您返回的是原始 grouped 承诺,而不是 .then 调用的结果。

    .then 不会修改传递的 Promise,它会创建一个新的 Promise,但您正在丢弃它。

    应该是:

    function doSomething() {
        var firstPromise = $.Deferred(function(dfd) { dfd.resolve(1); }).promise();
        var secondPromise = $.Deferred(function(dfd) { dfd.resolve(2); }).promise();
    
        var grouped = $.when(firstPromise, secondPromise);
    
        return grouped.then(function(firstResult, secondResult){
            return secondResult;
        });
    }
    

    【讨论】:

    • 谢谢 :) 我一定忘记了 then 返回另一个承诺。
    猜你喜欢
    • 2017-12-08
    • 2017-02-22
    • 1970-01-01
    • 2017-07-26
    • 2017-05-16
    • 2021-02-18
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多