Как отловить ошибку обратного вызова при попытке поймать? - PullRequest
0 голосов
/ 19 января 2019

У меня есть асинхронная функция, которая захватывает содержимое файла, например:

async function getFile (name) {
  return new Promise(function (resolve, reject) {
    fs.readFile(`./dir/${name}.txt`, 'utf8', function (error, file) {
      if (error) reject(error)
      else resolve(file)
    })
  })
}

И я вызываю эту функцию в консольный журнал

getFile('name').then( console.log )

Если я сделаю ошибку, такую ​​как неправильное написание имени файла, я получу эту удобную ошибку:

(node:17246) UnhandledPromiseRejectionWarning: Unhandled promise
rejection. This error originated either by throwing inside of an async 
function without a catch block, or by rejecting a promise which was not 
handled with .catch(). (rejection id: 1)

Я могу исправить это, выполнив это:

getFile('name').then( console.log ).catch( console.log ), но есть лиспособ справиться с ошибкой в ​​обратном вызове?Возможно попытка поймать?Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Если я правильно понимаю, вы хотите, чтобы ваша функция разрешалась независимо от того, была ли у вас ошибка и нет. Если это так, вы можете просто resolve в любом случае:

async function getFile (name) {
  return new Promise(function (resolve, reject) {
    fs.readFile(`./dir/${name}.txt`, 'utf8', function (error, file) {
      if (error) resolve(error)
      else resolve(file)
    })
  })
}

Тогда вам нужно будет обработать ошибки снаружи, например,

getFile('name')
  .then(getFileOutput => {
    if (getFileOutput instanceof Error) {
      // we got an error
    } else {
      // we got a file
    }
  })

или

const getFileOutput = await getFile('name');
if (getFileOutput instanceof Error) {
  // we got an error
} else {
  // we got a file
}

Это то, что вы ищете?

0 голосов
/ 19 января 2019

Вам все еще нужно отлавливать ошибки, которые rejected.

Я думаю, это то место, откуда вы вызываете вашу getFile функцию - которая должна быть заключена в блок try/catch

try {
  const result = await getFile('name')
} catch(e) {
  ... You should see rejected errors here
}

Или, я думаю, это подойдет для вашего примера:

await getFile('name').then( console.log ).catch(e => {...})

Тестирование этого в консоли Chrome DevTools:

async function test () {
  return new Promise(function(resolve, reject) {
    throw 'this is an error';
  })
}

И вызов его через следующий код:

await test().catch(e => alert(e))

Показывает, что это действительно работает!

...