Как я могу поймать ошибку, вызванную асинхронной функцией? - PullRequest
0 голосов
/ 16 декабря 2018
try {
  const promise = new Promise(async (resolve, reject) => {
    reject('oe')
  })
  .catch(async (err) => {
    console.log('bbbbb', err)
    throw err
  })
} catch (err) {
  console.log('aaaaa', err)
}

Можно сделать aaaaa loggable

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Вы можете использовать async/await:

async function test() {
  try {
    const promise = await new Promise(async (resolve, reject) => {
      reject('oe')
    }).catch(async err => {
      console.log('bbbbb', err)
      throw err
    })
  } catch (err) {
    console.log('aaaaa', err)
  }
}
test()
0 голосов
/ 16 декабря 2018

В общем случае нет смысла передавать функцию async в функцию обещания then или catch.И никогда не имеет смысла передавать его в конструктор обещаний.Если вы собираетесь пойти async, сделайте это раньше.Кроме того, если вы хотите отклонить обещание для тестирования и т. Д., Просто используйте Promise.reject('oe').

Чтобы поймать ошибку из функции async с try / catch, вы должныбыть в async функции.В этом случае минимальным изменением вашего примера будет await результат вызова catch:

// Assuming this is in an `async` function, making only minimal changes
try {
  const promise = new Promise(async (resolve, reject) => {
    reject('oe')
  })
  .catch(async (err) => {
    console.log('bbbbb', err)
    throw err
  })
  await promise;  // ***
} catch (err) {
  console.log('aaaaa', err)
}

Если вы не используете функцию async, вы можете 't try / catch используется для перехвата ошибок из обещаний (включая вызов функции async, поскольку они возвращают обещания).Вместо этого вы должны использовать обещание, возвращаемое catch:

// Assuming this is NOT in an `async` function, making only minimal changes
const promise = new Promise(async (resolve, reject) => {
  reject('oe')
})
.catch(async (err) => {
  console.log('bbbbb', err)
  throw err
})
.catch(err => {
  console.log('aaaaa', err)
})

Внося большие изменения, если вы уже находитесь в функции async, избавьтесь от then иcatch звонки:

// Assuming this is in an `async` function
try {
  try {
    await Promise.reject('oe');
  } catch (innerError) {
    console.log('bbbbb', innerError);
    throw innerError;
  }
} catch (outerError) {
  console.log('aaaaa', outerError);
}
...