js asyn c с правильной обработкой ошибок без ожидания - PullRequest
0 голосов
/ 24 апреля 2020

Может кто-нибудь предложить мне, как я могу воспроизвести этот код с надлежащей обработкой ошибок, не используя await? Я хотел бы запускать fnA / B / C асинхронно, а не последовательно с await, я также хотел бы обрабатывать все отклонения, которые будут обрабатываться в главном блоке перехвата.

Спасибо

async function() {
  try {
    let a = await fnA();
    let b = await fnB();
    let c = await fnC();
    return(a+b+c);
  }
  catch(e) {
    e.exitCode === 'fnAError' ? doSomething : null;
    e.exitCode === 'fnBError' ? doSomething : null;
  }
}

После всех предложений вот что я закончил:

const caller = async () => {
  try {
    let promisePool = [];
    let a = await testA();
    let b = promisePool.push(testB()) - 1;
    let c = promisePool.push(testC()) - 1;

    let q = await Promise.all(promisePool);
    // Get all the non awaited values
    console.log(q[b]);
  }
  catch(e) {
    console.log('caller catch');
    console.log('ERROR: ' + e);
  }
}

Спасибо всем

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

У вас проблема с АБ.

Если вы хотите, чтобы они работали параллельно, а не последовательно, то решение состоит не в том, чтобы не использовать await, а в том, чтобы использовать Promise.all. * 1005. *

try {
    let [a, b, c] = await Promise.all([fnA(), fnB(), fnc()]);
    return a + b + c;
}

Вам просто нужно дождаться всех обещаний, а не каждого по очереди.

0 голосов
/ 24 апреля 2020

Вы можете объединить await с Promise.all() следующим образом:

async function() {
  try {
    const [a,b,c] = await Promise.all([fnA(), fnB(), fnC()]);
    return(a + b + c);
  }
  catch(e) {
    e.exitCode === 'fnAError' ? doSomething : null;
    e.exitCode === 'fnBError' ? doSomething : null;
    throw e;
  }
}

Или вместо них можно использовать .then() и .catch():

async function() {
    return Promise.all([fnA(), fnB(), fnC()]).then(([a, b, c]) => {
        return a + b + c;
    }).catch(err => {
        e.exitCode === 'fnAError' ? doSomething : null;
        e.exitCode === 'fnBError' ? doSomething : null;
        throw e;
    });
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...