2013-11-12 4 views
2

У меня есть вложенное обещание, когда функция вызывает другую функцию и обе возвращает обещания. Функция b вызывается функцией a, и когда выполняется обещание функции a, функция b решает свою собственную отсрочку и передает результат от a и собственный результат.Обещание, которое возвращает обещание

function a(){ 
    var d = $.Deferred(); 
    makeSomeAsyncCall(function(){ 
    d.resolve('a') 
    }) 
    return d.promise(); 
} 

function b(){ 
    var d = $.Deferred(); 
    a= a() 

    a.done(function(a){d.resolve(a, 'b')}) 
    .fail(function(a){d.reject(a, 'b')}) 

    return d.promise(); 

} 

b().done(function(a, b){console.log(a, b)}) 
.fail(function(a, b){console.log(a, b)}) 

Интересно, есть ли способ Райта это без создания отложила в функции b

+2

Какова цель 'b'? почему не может 'b' просто вернуть' a' напрямую? Я думаю, вы слишком упростили свой пример, до такой степени, что его можно упростить, чем вы, вероятно, захотите. 'a(). done (function (a) {console.log (arguments)}). fail (function (a) {console.log (arguments)})' –

+0

Дело в том, что 'b' должен добавить свой собственный параметр к разрешенному отложенному. Таким образом, чтобы начальный вызов мог записывать '' a ''и' "b" '. Я не могу найти способ сделать это без второго отложенного в функции 'b' –

+1

Тогда ответ не будет, в той или иной форме вам придется создать новый отложенный объект, если вы хотите добавить к нему параметры. Возможно, это возможно, но, возможно, но я не думаю, что в этом случае было бы намного чище (и все равно потребуется создать новый объект с отсрочкой.) –

ответ

2

Интересно, есть ли способ Райта это без создания отложила в функции Ь

Да, есть. Цепь двух (потенциально асинхронных) функций является единственной целью основного метода promise, then (в старых версиях, известных как pipe). Просто напишите

function b() { 
    return a().then(function success(aresult) { 
     return [aresult, "b"]; 
    }, function error(aerror) { 
     return $.Deferred().reject(aerror, "b"); 
    }); 
} 

Я не уверен, действительно ли вам это нужно error обработчик, если вы не указываете, то aerror будет распространяться автоматически.

0

Интересно, есть ли способ Райта это без создания отложила в функции Ь

Нет, я не верю, что есть. Если a управляет решением своей собственной отсрочки, и b хочет вернуть отложенное, которое получает два значения, один из которых является результатом a, то вы должны создать экземпляр нового отложенного в пределах b.

Однако было бы интересно точно узнать, почему вы структурируете его так, как это описано в примере обработки в b() игнорирует результат a(). Возможно, вы захотите рассмотреть возможность создания отложенных результатов для a и b, которые полностью независимы друг от друга, а затем присоединяются к ним, когда вы вызываете их вместо вложенности вызовов. Использование $ .when():

$.when(a(), b()).done(function(a,b) { 
    // process both results 
}).fail(function(a,b) { 
    // process both results 
}); 

Написано так b() не нужно ничего знать о a().

Смежные вопросы