2015-02-13 4 views
0

У меня есть цепь обещаний, выглядит следующим образом:Выход обещание цепь на первый обратный вызов ошибки

Transaction.findPublic({}).then(function(transactions) { 
     combined = combined.concat(transactions); 
     return JoinEvent.find().exec(); 
    }, function(err) { 
     return res.status(503).send(err); 
    }).then(function(joins) { 
     combined = combined.concat(joins); 
     return NewCategoryEvent.find().exec(); 
    }, function(err) { 
     return res.status(503).send(err); 
    }); 

Это действительно непонятно, если это res.send() будет на самом деле выйти из моего посыла цепь. Его можно просто отправить в следующий .then(), который определенно не сработает.

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

Will return res.send() выход из этого обещания цепь? Если нет, могу ли я вместо этого вырваться из-за ошибки?

ответ

1
Transaction.findPublic({}).then(function(transactions) { 
     combined = combined.concat(transactions); 
     return JoinEvent.find().exec(); 
    }).then(function(joins) { 
     combined = combined.concat(joins); 
     return NewCategoryEvent.find().exec(); 
    }).catch(function(err) { 
     res.status(503).send(err); 
    }); 

Объяснение: Когда цепь обещаний и reject (ошибка) происходит, это будет пропускать все следующие fullfill (успех) обратные вызовы до rejection (ошибка) обратного вызова будет найден, он называет первым обнаружил отказ обратный вызов (затем переходит к следующему обещанию), если ни один не найден, он выдает ошибку.

также catch(func) эквивалентен then(undefined, func), но более читаемым.

для получения дополнительной информации: promise error handling.

+0

Будет ли последнее решение поймать ошибку, которая происходит в середине цепи, скажем, во втором я обеспечил или гипотетическую третью? Также очень чистый и понятный ответ. – ritmatter

+0

@ritmatter да, он ловит, если ничего перед этим не поймал отклонение уже, также я обновил ответ, надеюсь, что теперь это станет более ясным. – mido

+0

спасибо за разъяснение, хорошее решение для темы, на удивление трудно найти простую информацию о – ritmatter