我似乎无法绕开为什么这行不通的想法。
因为main
回报承诺;所有async
功能都可以。
在顶层,您必须:
使用async
永不拒绝的顶层函数(除非您希望出现“未处理的拒绝”错误),或者
使用then
和catch
,或
(即将推出!)使用top级别await
的提案,该提案已进入允许在模块中顶级使用的过程的第3阶段await
。
#1- async
永不拒绝的顶级功能
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
注意catch
; 您必须处理promise拒绝/异步异常,因为没有其他事情可做;您没有呼叫者将其传递给。如果愿意,可以在通过catch
函数(而不是try
/ catch
语法)调用它的结果上执行此操作:
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
...更加简洁(出于这个原因,我喜欢)。
或者,当然,不处理错误,而只允许“未处理的拒绝”错误。
#2- then
和catch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
该catch
如果发生在链中或在你的错误处理程序将调用then
处理程序。(请确保您的catch
处理程序不会抛出错误,因为没有任何内容可以处理。)
或两个参数都then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
再次注意,我们正在注册一个拒绝处理程序。但是以这种形式,请确保您then
回调都不会引发任何错误,也没有任何内容可处理。
#3顶级await
模块
你不能用 await
在非模块脚本的顶层使用await
,但是顶层建议(第3阶段)允许您在模块的顶层使用它。这与使用顶级async
函数包装器(上面的#1)相似,因为您不希望顶级代码拒绝(抛出错误),因为这将导致未处理的拒绝错误。因此,除非您要在出现问题时(例如#1)遇到未处理的拒绝,否则您要将代码包装在错误处理程序中:
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
请注意,如果执行此操作,则从该模块导入的任何模块都将等到诺言 await
得以;当await
评估使用顶层的模块时,它基本上会向模块加载器返回一个承诺(就像async
函数一样),该加载器会等到该承诺得到解决,然后再评估依赖于该模块的任何模块的主体。
await
只是诺言then
语法的糖。