ES6 async函数里包含另一个async函数是为什么?

发布于 2022-09-12 13:31:07 字数 267 浏览 6 评论 0

今天在看一个大佬的github项目,他在写登录函数的时候是这样写的:

async login(req, res, next){
    const form = new formidable.IncomingForm();
    form.parse(req, async (err, fields, files) => {
        /...some code
    })
}

他这里是两个async,这里为啥写两个啊,只写外面一个总的不行吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

≈。彩虹 2022-09-19 13:31:07

async 是函数的一种类型,每一个都要写,不写就不是。

并不是说 async 函数里定义的函数就是 async 函数。

英雄似剑 2022-09-19 13:31:07

如果只有外层函数是 async 函数的话,内层函数里写的 await 会报语法错误
可以简单粗暴地认为 async 有类似作用域的影响范围,这个范围仅包括函数自己的函数体,而不包括其函数体内部声明的其他函数体。

姜生凉生 2022-09-19 13:31:07

声明函数为 async ,说明这是个异步(返回类型为 promise )的函数。
但是函数 login 为异步的,不说明 login 中的所有函数都是异步的。如果不 await ,还是会从上往下执行,执行完最后一行代码,就直接返回了。
比如你代码中的

async login(req, res, next){
    const form = new formidable.IncomingForm();
    form.parse(req, async (err, fields, files) => {
        /...some code
    })
}

login函数 返回的时候,你的 form.parse 可能还没有解析完成。(没有 await,所以代码不会等待异步完成,就执行下一行了)
比较合理的应该是:

async login(req, res, next){
    const form = new formidable.IncomingForm();
    await form.parse(req, async (err, fields, files) => {
        /...some code
        // 这里可能还有一些异步处理,需要 await ,不然这个函数是没有必要 async 的
    })
}

参考 :https://segmentfault.com/a/11...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文