当前位置: 首页 > 知识库问答 >
问题:

如何在顶层使用Async/Await?

帅令雪
2023-03-14

我已经复习了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):

>外:“对象承诺”

>内部:嘿那里

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

有没有一种方法可以使用函数内部返回的值,而不用.then()后面的main()

共有1个答案

梁研
2023-03-14

我似乎无法理解为什么这不起作用。

因为main返回一个承诺;所有async函数都可以。

在最高层,您必须:

>

  • 使用从不拒绝的顶级async函数(除非您希望出现“未经处理的拒绝”错误),或者

    使用thencatch,或

    (马上就要来了!)使用顶级await,这是一个已达到流程第3阶段的建议,允许在模块中顶级使用await

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

    注意catch;您必须处理承诺拒绝/异步异常,因为其他的都不会处理;您没有可将它们传递给的呼叫者。如果您愿意,可以通过catch函数(而不是try/catch语法)调用它的结果来实现:

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

    ...更简洁一点(因为这个原因我喜欢它)。

    或者,当然,不处理错误,只允许“未处理拒绝”错误。

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

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

    then的两个参数:

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

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

    您不能在非模块脚本的顶层使用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
    }
    

    请注意,如果您这样做,任何从您的模块导入的模块都将等待,直到您的awaiting承诺解决为止;当使用顶级await的模块被评估时,它基本上会向模块加载器返回一个承诺(就像async函数所做的那样),该模块加载器会等待该承诺被确定,然后再评估依赖于它的任何模块的主体。

  •  类似资料:
    • 问题内容: 我一直在浏览/ 在浏览了几篇文章之后,我决定自己测试一下。但是,我似乎无法绕开为什么这行不通的想法: 控制台输出以下内容(节点v8.6.0): 外部:[对象承诺] 内部:嘿 为什么函数内部的日志消息随后执行?我认为创建/ 的原因是为了使用异步任务执行同步执行。 有没有办法可以使用函数内部返回的值而不使用after ? 问题答案: 我似乎无法绕开为什么这行不通的想法。 因为回报承诺;所有

    • 理想的情况下,我希望我的应用程序只有顶级的try/catch,大多数的例外只是冒出来。但有了它,您将得到UnhandledPromiseRejectionWarning。 我的问题是,而不是再放一个。后面抓。那么,有没有办法绕过?谢谢!

    • 这是我的方法: 我显示加载程序时,但使用在抛给我一个关于字保留的错误。对于验证,我使用VeeValester 如何使用wait-insidepromise?

    • 关于图层 创建复杂图稿时,要跟踪文档窗口中的所有项目,绝非易事。有些较小的项目隐藏于较大的项目之下,增加了选择图稿的难度。而图层则为您提供了一种有效方式,来管理组成图稿的所有项目。您可以将图层视为结构清晰的含图稿文件夹。如果重新安排文件夹,就会更改图稿中项目的堆叠顺序。您可以在文件夹间移动项目,也可以在文件夹中创建子文件夹。 文档中的图层结构可以很简单,也可以很复杂,这一切都由您而定。默认情况下,

    • 本文向大家介绍Array.filter中如何正确使用Async,包括了Array.filter中如何正确使用Async的使用技巧和注意事项,需要的朋友参考一下 1. 如何仅保留满足异步条件的元素 在第一篇文章中,我们介绍了 async / await 如何帮助处理异步事件,但在异步处理集合时却无济于事。在本文中,我们将研究该filter函数,它可能是支持异步函数的最直观的方法。 2. Array.