我似乎无法理解为什么这不起作用。
因为main
返回一个Promise;所有async
功能都可以。
在顶层,您必须:
使用async
从不拒绝的顶级函数(除非您想要“未处理的拒绝”错误),或
使用then
和catch
, 或
(即将推出!)使用top-levelawait
,该提案已在流程中达到第 3 阶段,允许await
在module中进行顶级使用。
#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
回调都不会引发任何错误,也没有注册任何内容来处理它们。
#3await
module中的顶层
您不能await
在非module脚本的顶层使用await
,但顶层提案(第 3 阶段)允许您在module的顶层使用它。它类似于使用顶级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
}
请注意,如果您这样做,从您的module导入的任何module都将等到您的Promiseawait
解决;当await
评估使用顶级的module时,它基本上会向module加载器返回一个Promise(就像一个async
函数一样),它会等到该Promise得到解决,然后再评估依赖于它的任何module的主体。