我似乎无法绕开为什么这行不通的想法。
因为
main回报承诺;所有
async功能都可以。
在顶层,您必须:
使用
async
永远不会拒绝的顶层函数(除非您希望出现“未处理的拒绝”错误),或者使用
then
和catch
,或(即将推出!) 使用顶层
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 landstry { var text = await main(); console.log(text);} catch (e) { // Deal with the fact the chain failed}


