Как сделать обработку ошибок с помощью async / await без необходимости ждать - PullRequest
0 голосов
/ 28 сентября 2018

Возьмите следующий надуманный пример:

const housekeepingStuff = async function (data) {
    const result = await notImportant(data);
    result.more = 'yawn';
    storeInDatabase(result);
};

const getStuff = async function () {
    try {
        const data = await getData();
        data.extra = 'wow';
        housekeepingStuff(data); // <---- don't want to await... but need to for error catching
        return Promise.resolve(data);
    } catch (err) {
        return Promise.reject(err);
    }
};

try {
    const myData = await doSomeStuff();
    res.send(myData);
} catch (err) {
    console.log(err);
    res.sendStatus(400);
}

Я хочу вернуть данные из getStuff () КАК МОЖНО СКОРЕЕ, не дожидаясь housekeepingStuff(), но если я не жду эту функцию, то у меня возникнет ошибка,

Я мог бы вызвать housekeepingStuff() вне функции getStuff(), после получения и отправки данных тому, кто захочет:

try {
    const myData = await doSomeStuff();
    res.send(myData);
    await housekeepingStuff(data); // <---- am awaiting but who cares because nothing follows
} catch (err) {
    console.log(err);
    res.sendStatus(400);
}

Но это не так, потому что я нене нужно помнить, чтобы каждый раз, когда я звоню doSomeStuff(), звонил housekeepingStuff() ... в идеале он должен обрабатываться "внутренне".

Какой здесь правильный подход?

1 Ответ

0 голосов
/ 28 сентября 2018

Функция обещания (или асинхронная) имеет 2 возможных результата:

  1. Успешный результат
  2. Результат ошибки

Чтобы получить любой результат,Вы должны ждать этого.Вы не можете ждать одного условия, а не другого, потому что все это должно быть выполнено, чтобы вы могли узнать, каков был результат.

В противном случае вы действительно запрашиваете движок javascript:мне, если функция потерпит неудачу, и если это произойдет, дождитесь ее.

Поэтому правильный подход - просто ждать ее.

Однако, если вас не волнует, успешен или неудаченрезультаты этой функции, просто вызовите функцию через другую асинхронную функцию, которая съедает все ошибки:

async function doSomeStuffAndIgnoreError() {
   try {
     await doSomeStuff();
   } catch (e) {
     console.error(e);
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...