顶层不允许等待,我的期望是下面抛出的错误只会被记录为警告,但事实证明它是完成的阻碍,即在语句
await fsProm.stat
后处理基本上停止。我不明白为什么?
const fsProm = require('fs').promises;
async function codeWithUnhandledPromise(){
const notAwaited = Promise.resolve().then(function(){
throw new Error('Irrelevant');
});
await fsProm.stat( __filename );
console.log( 'Not reached' );
}
async function main(){
try {
await codeWithUnhandledPromise();
} catch (error) {
console.log( 'Not reached' );
} finally {
console.log( 'Not Reached' );
}
}
main().then(undefined,function(){
console.log( 'Not Reached' );
return;
});
console.log( 'done' );
您没有看到
codeWithUnhandledPromise
的承诺的履行或拒绝的原因是 Node.js 现在会终止未处理的拒绝的流程。您可以使用 --unhandled-rejections
命令行标志来修改该行为。
多年来,Node.js 的各个版本都警告说,在未来的某个版本中,未处理的拒绝会导致程序终止。例如,如果您使用 Node.js v14 运行该代码,您会收到此警告:
[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。将来,未处理的 Promise 拒绝将会以非零退出代码终止 Node.js 进程。
它不再是警告(除非您再次启用它)。标准行为现在与未处理的异常一致:它们终止程序。