Возможно, это не прямой ответ, но мы с моей командой создаем библиотеку для обработки асинхронных / ожидающих обещаний без необходимости использования блоков try / catch.
Установить модуль
npm install await-catcher
Импорт awaitCatcher
const { awaitCatcher } = require("await-catcher")
Используй это!
Вместо этого:
async function asyncFunctionCaller2(fn) {
try {
await fn();
} catch (err) {
throw new Error(err);
}
}
Теперь вы можете сделать это:
async function asyncFunctionCaller2(fn) {
let [ data, err ] = await awaitCatcher(fn);
// Now you can do whatever you want with data or error
if ( err ) throw err;
if ( data ) return data;
}
// Note:
// You can name the variables whatever you want.
// They don't have to be "data" or "err"
Библиотека await-catcher проста. Возвращает массив с двумя индексами.
1) Первый индекс содержит результаты / данные ИЛИ неопределенный в случае ошибки
"[ data , undefined]"
2) Второй индекс содержит ошибку ИЛИ неопределенную, если ошибки нет
"[undefined, error]"
Await-catcher также поддерживает типы в TypeScript. Вы можете передавать типы для проверки по возвращаемому значению, если используете TypeScript.
* +1039 * Пример:
interface promiseType {
test: string
}
(async () => {
let p = Promise.resolve({test: "hi mom"})
let [ data , error ] = await awaitCatcher<promiseType>(p);
console.log(data, error);
})()
Мы обновим наше репозиторий GitHub, чтобы очень скоро включить документацию.
https://github.com/canaanites/await-catcher
EDIT:
Похоже, что движок V8 "теряет" трассировку стека ошибок при запуске нового тика. Он возвращает только стек ошибок с этой точки. Кто-то ответил на аналогичный вопрос здесь .
Измените свой код на это:
https://codesandbox.io/embed/empty-wave-k3tdj
const { awaitCatcher } = require("await-catcher");
async function asyncAlphaObjectLiteral() {
throw Error("I am an object literal!"); // 1) You need to create an Error object here
// ~~~~> try throwing just a string and see the difference
}
async function asyncFunctionCaller2(fn) {
try {
await fn();
} catch (err) {
throw err; // 2) Don't create a new error, just throw the error.
}
}
/**
* Or you can just do this...
* the "awaitCatcher" will catch the errors :)
*
* async function asyncFunctionCaller2(fn) {
* await fn();
* }
*/
async function everything() {
/**
* notice we don't need try/catch here either!
*/
let [data, error] = await awaitCatcher(
asyncFunctionCaller2(asyncAlphaObjectLiteral)
);
console.log(error); // 3) Now you have the full error stack trace
}
everything();
Заключение
Не рекомендуется бросать строку вместо объекта Error. Отладка будет сложнее и может привести к потере трассировки стека ошибок. Настоятельно рекомендуем прочитать это: Бросать строки вместо ошибок