Обещания jQuery - уменьшить несколько успешных результатов $.when до одного?

В настоящее время я использую jQuery 1.9.1.

Я занят цепочкой двух обещаний, чтобы они оба выполнялись до обработки результата, но меня волнует только передача результата второго обещания вызывающим сторонам.

Моя первая попытка была ниже (пожалуйста, также не обращайте внимания на то, что я не обрабатываю случаи ошибок):

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, вызывающей стороне будет передано только это.

Моя вторая попытка решает проблему, но для этого нужно использовать другой отложенный:

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

Здесь я просто создаю новое обещание, которое разрешается только со вторым результатом сгруппированного обещания, и вместо этого возвращаю это обещание.

Это все хорошо, но, возможно, есть более простой способ сделать это с обещаниями jQuery?


person jamiebarrow    schedule 19.09.2013    source источник


Ответы (1)


Ваша проблема в строке 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;
    });
}
person Alnitak    schedule 19.09.2013
comment
Спасибо :) Должно быть, я забыл, что then возвращает другое обещание. - person jamiebarrow; 19.09.2013