2016-08-10 2 views
1

Я использую Promises в проекте NodeJS и хотел бы лучше понять Promise.chains.Понимание цепей обещаний

У меня есть по одной открытой функции:

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

Эта функция Главной библиотеки вызовет многие другие библиотечные функции, которые я хочу связать. Таким образом, каждая из этих функций будет возвращать обещание так:

mainLibraryFunction = function (arguments...) { 
    return this.firstLibraryFn().then(secondLibraryFn).then(thirdLibraryFn)... 
} 

Каждый из них будет возвращать обещание, которое может быть либо отклонить или решить. Я бы хотел, чтобы, если какая-либо из функций библиотеки отклоняется, вместо этого, передавая отказ следующей функции, я хотел бы вернуть отклонение от функции MainLibraryFunction. Потому что в противном случае мне нужно реализовать обработку случая ошибок для каждой из функций libraryfunctions. Поскольку каждый из них получит обещание в качестве аргумента, мне нужно будет проверить каждую из функций, которые я получил, или отклонил обещание как paramater. Затем мне нужно будет передать этот отклоненный параметр через все функции до тех пор, пока последняя функция не сможет вернуть его из функции MainLibraryFunction. Это было бы неразумно.

Итак, какова была бы оптимальная практика? Должен ли я добавить улов в конце цепи? Я слышал, если я добавлю улов к концу, он должен сломать цепочку, даже если кто-то из них отклонит. Затем из улова я могу вернуть Promise.reject() из функции MainLibraryFunction.

+1

Если вы не обрабатываете ошибку, то она будет просто возвращена из функции и может быть уловлена ​​вызывающим устройством с помощью .catch. Если обещание отклонено, то последующие вызовы будут вызываться только в том случае, если у них есть обработчик ошибок, например. [...] '- обратите внимание на parens – ndonohoe

+0

NB: это должно быть 'return this.firstLibraryFn(). then (...)() '' после '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Alnitak

+0

Спасибо, я отредактировал его, чтобы исправить –

ответ

2

Метод .then принимает два аргумента: onFulfilled и onRejected. Если вы не ответите на вызов onRejected, то этот номер .then не будет вызываться, и цепочка попадет в следующий обработчик, который реализует onRejectedили.catch.

Promise.reject() 
 
    .then(() => console.log('onFulfilled 1')) 
 
    .catch(() => console.log('catch 1')); // will get called 
 

 
Promise.reject() 
 
    .then(
 
     () => console.log('onFulfilled 2'), 
 
     () => console.log('onRejected 2') // will get called 
 
    ) 
 
    .catch(() => console.log('catch 2')); // will not get called

Как таковой, нет, вы не должны делать каждая функция разбора их аргументов. secondLibraryFn и т. Д. Не будут называться, если обещание будет отклонено, поскольку они определены только как обработчики onFulfilled. Вы можете смело предположить, что они будут пропущены и просто добавят .catch в конце цепи, где вы хотите поймать любые ошибки.

+0

. Стоит отметить, что любой'. then (successFn, ​​failureFn) – ste2425

+1

Другими словами, любой обработчик * ошибки *, который вы вставляете в цепочку ('onRejected' * или *' .catch'), будет ловить ошибки до этой точки в цепочке, после чего выполнение цепочки будет продолжено, как обычно. – deceze

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