Я сделал много асинхронного кодирования в Node.js с обратными вызовами и отличной асинхронной библиотекой, которая отлично работает. Я пытаюсь использовать модуль, который использует обещания, но я столкнулся с проблемой, когда любые ошибки, возникшие ПОСЛЕ обещания, все еще пузырятся и пойманы обработчиком ошибок обещаний.Promise.catch является ошибкой глотания
Это очень затрудняет отладку ошибок, так как я понятия не имею, где они будут всплывать, и их нельзя выбросить и не разбивать приложение.
Пример кода ниже; все, что я хочу сделать, это выйти из цепочки обещаний и оставить ее после того, как она будет решена, а не поймать все последующие ошибки, которые не имеют к этому никакого отношения.
function one (input, callback) {
doSomeAsyncWork(input)
.then(function (result) {
return callback(null, result);
})
.catch(function (err) {
logError(err);
return callback(err);
});
}
function two (err, result) {
if (err) { ... }
var x = callAMethodThatThrows();
...
}
one('abc', two);
В этом примере метода callAMethodThatThrows() выдает ошибку, которая получает барботировала до обещания улова() блока. Это предотвращает сбой приложения и оставляет его в неизвестном состоянии.
Любой совет будет очень благодарен, спасибо.
Спасибо, Бен, это помогло. В настоящее время наша база кода написана с использованием обратных вызовов, поэтому для нас имеет смысл придерживаться одного способа делать что-то. Я с нетерпением жду ключевых слов async/wait, чтобы приземлиться, поэтому нам не нужно беспокоиться об этих вещах! –
@ JoshCole async/await - это просто сахар для обещаний. Ваш ответ (с помощью nodeify) в порядке - лично я бы сделал это с bluebird и 'asCallback', но оба они в порядке. В общем, для библиотеки не рекомендуется предлагать API обещаний без какого-либо способа отказаться от него. –
Полезно знать.Тем не менее, если мы собираемся потратить время на рефакторинг нашего кода, я предпочел бы подождать, пока у нас не будет сахара. Приветствия. –