1

我目前正在使用 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 承诺来做到这一点?

4

1 回答 1

2

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

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

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

它应该是:

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;
    });
}
于 2013-09-19T11:37:00.573 回答