我有一个异步功能,可以抓取文件内容,如下所示:
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 )
,但是有没有办法处理回调中的错误?也许尝试一下?我该怎么办?
答案 0 :(得分:2)
您仍然需要捕获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))
表明这确实有效!
答案 1 :(得分:1)
如果我的理解正确,那么无论您是否遇到错误,都希望函数能够解析。如果是这样,则无论哪种情况都可以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
}
这是您要找的吗?