编程语言
首页 > 编程语言> > javascript – 如何在顶级使用async / await?

javascript – 如何在顶级使用async / await?

作者:互联网

我一直在浏览async / await,经过几篇文章后,我决定自己测试一下.但是,我似乎无法理解为什么这不起作用:

async function main() {  
    var value = await Promise.resolve('Hey there');
    console.log('inside: ' + value);
    return value;
}

var text = main();  
console.log('outside: ' + text)

控制台输出以下内容(节点v8.6.0):

> outside: [object Promise]

> inside: Hey there

为什么函数内部的日志消息会在之后执行?我认为创建async / await的原因是为了使用异步任务执行同步执行.

有没有办法在main()之后使用函数内部返回的值而不使用.then()?

解决方法:

I can’t seem to wrap my head around why this does not work.

因为主要回报承诺;所有异步函数都可以.

在顶层,您必须:

>使用永不拒绝的顶级异步函数(除非您想要“未处理的拒绝”错误),或
>使用然后捕捉,或
>(即将推出!)使用top-level await,该提案已在process中达到阶段3,允许在模块中顶级使用await.

#1 – 永不拒绝的顶级异步功能

(async () => {
    try {
        var text = await main();
        console.log(text);
    } catch (e) {
        // Deal with the fact the chain failed
    }
})();

注意抓住;你必须处理承诺拒绝/异步异常,因为没有别的东西;你没有调用者将它们传递给.如果您愿意,可以通过catch函数调用它的结果(而不是try / catch语法):

(async () => {
    var text = await main();
    console.log(text);
})().catch(e => {
    // Deal with the fact the chain failed
});

…这更简洁一些(因为这个原因,我喜欢它).

或者,当然,不要处理错误,只是允许“未处理的拒绝”错误.

#2 – 然后赶上

main()
    .then(text => {
        console.log(text);
    })
    .catch(err => {
        // Deal with the fact the chain failed
    });

如果链中或then处理程序中发生错误,将调用catch处理程序. (确保您的catch处理程序不会抛出错误,因为没有注册任何错误来处理它们.)

或者两个论点:

main().then(
    text => {
        console.log(text);
    },
    err => {
        // Deal with the fact the chain failed
    }
);

再次注意我们正在注册一个拒绝处理程序.但是在这种形式中,请确保您的后续回调都没有抛出任何错误,没有注册任何错误来处理它们.

#3顶级等待模块

您不能在非模块脚本的顶级使用await,但顶级等待提议允许您在模块的顶级使用它.它与使用顶级异步函数包装器(上面的#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
}

标签:ecmascript-2017,javascript,node-js,async-await
来源: https://codeday.me/bug/20190916/1808036.html