今天在看一个大佬的github项目,他在写登录函数的时候是这样写的:
async login(req, res, next){
const form = new formidable.IncomingForm();
form.parse(req, async (err, fields, files) => {
/...some code
})
}
他这里是两个async,这里为啥写两个啊,只写外面一个总的不行吗?
今天在看一个大佬的github项目,他在写登录函数的时候是这样写的:
async login(req, res, next){
const form = new formidable.IncomingForm();
form.parse(req, async (err, fields, files) => {
/...some code
})
}
他这里是两个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 的
})
}
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
4 回答2.4k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
async 是函数的一种类型,每一个都要写,不写就不是。
并不是说 async 函数里定义的函数就是 async 函数。