Как обработать асинхронную ошибку в Node.js - PullRequest
0 голосов
/ 16 октября 2018

Есть ли альтернатива функции Promise.try от Bluebird.Поскольку я использую async/await, не заинтересован в добавлении зависимости от bluebird.

Есть ли лучший способ перехватить asynchronous error в Node.JS

await Promise.try(async function() {
    // Some code with async operations like readline
    await this.nextCall(batchData, true);
}).catch(async function(err) {
    // My error handling
});

Любые встроенные функции в Node.js 10.x?

ОБНОВЛЕНИЕ :

Есть ли лучший способ зафиксировать asynchronous error в Node.JS

try {
    let interfaceVal = lineReader.createInterface({
        input: fs.createReadStream(filePath)
    });
    interfaceVal.on('line', async (line) => {
        throw new Error('My custom Error');
    });
    // some sync operations
} catch(e) {
    // This catch wont get called with custom error
    console.log(e);
}

Любая идеяфиксировать такие асинхронные ошибки?

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Promise.try находится на его путь для спецификации .Вот полифилл :

if (typeof Promise !== 'function') {
    throw new TypeError('A global Promise is required');
}

if (typeof Promise.try !== 'function') {
    Promise.try = {
        try(func) {
            if (typeof this !== 'function') {
                throw new TypeError('Receiver must be a constructor');
            }
            return new this(function (resolve) {
                resolve(func());
            });
        }
    }.try;
}

Этот полифилл поддерживает подклассы обещаний и другие функции.Это безопасно для заполнения в Node.js.

0 голосов
/ 16 октября 2018

Вам не нужно явно указывать предложение catch в асинхронной функции, потому что она использует естественную семантику Error.Здесь ваша функция operation_A выдает ошибку, потому что operation_B отклонено.

const operation_B = () => {
    return new Promise((resolve,reject) => {
        window.setTimeout(() => {
            //resolve("RESOLVE: all your base are belong to us");
            reject("REJECT: all your base are belong to us");
        },2000);
    });
};

const operation_A = async () => {
   const B = await operation_B();
   return B.toUpperCase();
};

operation_A().then(console.log).catch(console.error);
0 голосов
/ 16 октября 2018

Нет смысла переносить 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);
}
0 голосов
/ 16 октября 2018

В nodeJs, если вы используете async / await, вы можете использовать обычные блоки try catch, и они будут отлавливать ваши ошибки (и это будет работать для асинхронных вызовов)

try {
   await this.nextCall(batchData, true);
}
catch(exc) {
 // handle error
}

это определение функции должнобыть объявлено как async

...