Раннее возвращение в асинхронную функцию - PullRequest
0 голосов
/ 28 ноября 2018

Предположим, что вам нужно вызвать асинхронную функцию, но вас не очень интересует ситуация успеха / неудачи этой функции.В этом случае каковы плюсы и минусы следующих двух шаблонов, указанных ниже в отношении стека вызовов, очереди обратных вызовов и цикла событий

Pattern-1

async setSomething() {
    try {
        set(); // another async function
    } catch (err) {
        // log the error here
    }
    return true;
}

Pattern-2

async setSomething() {
    try {
        await set(); // another async function
    } catch (err) {
        // log the error here
    }
    return true;
}

Ответы [ 2 ]

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

Этот ответ является довольно нетрадиционным советом на вопрос, а не фактическим ответом на примеры, опубликованные OP.

на самом деле не интересует ситуация успеха / неудачи этой функции

Если приведенный выше оператор имеет место, то это означает, что возврат не зависит от результата асинхронного вызова.

Когда вас не беспокоит возвращениеасинхронный вызов, лучше не использовать async/await или любой тип promise вообще.Вы можете просто вызвать функцию, как любую другую функцию, и обработать ее остальным кодом.

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

В шаблоне 1 не фиксируются какие-либо ошибки, которые могут возникнуть во время асинхронных операций в функции set - любые ошибки приведут к необработанному отклонению Promise, которого следует избегать.Шаблон 1 будет перехватывать только те ошибки, которые возникают во время синхронных операций * (например, при настройке запроса fetch), которые в большинстве случаев маловероятны.

Пример:

// open your browser's console to see the uncaught rejection

const set = () => new Promise((_, reject) => setTimeout(reject, 500));
async function setSomething() {
    try {
        set(); // another async function
    } catch (err) {
        console.log('err');
    }
    return true;
}

setSomething();

Таким образом, шаблон 2, вероятно, предпочтительнее.Если вас не волнует результат асинхронного вызова, то не звоните await или .then, когда вы звоните setSomething().

. Или, для чего-то такого простого, вы можете подумать об использованииPromise только методы, async функция не требуется:

const setSomething = () => set()
  .catch((err) => {
    // log the error here
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...