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

新手上路,请多包涵

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

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

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

阅读 3.1k
3 个回答

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

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

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

声明函数为 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...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题