Нет смысла переносить async
функцию с Promise.try
.Цель Promise.try
состоит в том, чтобы обрабатывать синхронные ошибки и отклонения аналогичным образом:
Начать цепочку обещаний с Promise.try.Любые синхронные исключения будут превращены в отклонения возвращенного обещания.
Это уже сделано с async
, поскольку оно всегда возвращает обещание.
Это можно использовать на верхнем уровнес async
IIFE:
(async function() {
await this.nextCall(batchData, true);
})().catch(console.error);
Или, если вложено async
, его можно опустить, отклонение может быть обработано в родительской функции async
с помощью try..catch
, как объясняется в другом ответе.
В этом случае ошибка может быть обнаружена только внутри async
функции:
interfaceVal.on('line', async (line) => {
try {
throw new Error('My custom Error');
} catch (err) {
console.error(err);
}
});
Использование не-обещающего API (потока узлов) не позволяет обрабатывать ошибкис обещаниями.Обратный вызов потока игнорирует отклоненные обещания и не позволяет распространять ошибку за пределы потока.
Обратные вызовы могут быть преобразованы в обещания только тогда, когда ожидается, что они будут вызваны once
.Это не относится к line
.В этом случае может использоваться асинхронный итератор, в этом одном из его вариантов использования .
Генератор событий может быть преобразован в асинхронный итератор с помощью p-event
и повторен с помощью for await of
внутри async
функция:
try {
let interfaceVal = lineReader.createInterface({
input: fs.createReadStream(filePath)
});
const asyncIterator = pEvent.iterator(interfaceVal, 'line', {
resolutionEvents: ['close']
});
for await (const event of asyncIterator) {
console.log('line', event);
// throw new Error('My custom Error');
}
} catch(e) {
console.log(e);
}