2015-09-19 5 views
2

В следующем коде, что послужило бы причиной возврата другого обещания от метода success или err? Как вы можете видеть, someFunction уже возвращает обещание, и мы можем легко вернуть его вызывающему.Причина возврата обещания от другого обещания?

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

function() { 
    var p = $q.defer(); 

    someModule.someFunction(input) 
    .then(
     function(success) { 
     return p.resolve(success); 
     }, 

     function(err) { 
     return p.reject(err) 
     } 
    ); 

    return p.promise; 
}; 
+0

Нет никакой причины, кроме неопытности или просто намеренно плохого кода. Даже если вы должны манипулировать ответом или ошибкой, вы не должны создавать отложенные. – Bergi

ответ

3

Всей эта вещь может быть заменен:

function someFunc() { 
    return someModule.someFunction(input); 
} 

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

Считается, что анти-шаблон не имеет успеха и обработчиков ошибок, которые просто делают в основном то, что было по умолчанию.

Действительно, единственное, что ваш фрагмент кода делает иначе, чем просто возвращение обещания напрямую, заключается в том, что он гарантирует, что возвращенное обещание - это обещание Q, а не любое обещание .someFunction(). Но если это требование, то это может быть передано Q-обещанию более непосредственно без всего дополнительного кода.

Это discussion of promise anti-patterns, которого следует избегать, потому что есть лучший способ.

+0

Это именно то, что я хотел услышать. Благодарю. – paytonpy

3

Нет причин для использования отложенного обещания в вашем случае. Фактически использование defer является одним из наиболее распространенных анти-шаблонов при использовании обещаний и должно использоваться только в очень конкретных случаях.

В отложенных анти-шаблонах объекты «отложенные» создаются без причины, усложняя код.

Эта излишняя упаковка также опасна, любые ошибки и ошибки проглатываются и не распространяются на вызывающего абонента этой функции .

Вместо использования Отложенного антишаблона, код должен просто вернуть обещание он уже имеет и распространять значения, используя возврат товара

Have быстро перечитали на Bluebird (одна из лучших библиотек обещаний) docs где обсуждается этот вопрос https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern

+0

Awesome. Спасибо за ссылку. – paytonpy

+1

В примерах анти-шаблона есть почти идентичный фрагмент кода: D – masimplo

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