本文主要是记录自己项目中遇到的问题,程序因为执行顺序没有按照期望运行
async findNewUser(keys) {
let haveNew = false
_.forEach(keys, async function(item){
const user = await this.getUser(item)
...//其他逻辑代码
if (user.isNewUser){
haveNew = true
}
})
if (haveNew) {
return { haveNew }
}
}
因为循环体内有异步的方法,所以forEach中的函数加了async,导致后面if语句执行流程提前于foreach,但是逻辑上if语句的执行,依赖于foreach的处理结果,导致程序出错
解决方法
1、使用for循环代替foreach,循环次数统计,最后一次循环结束后处理后续逻辑
async findNewUser(keys){
let haveNew = false
let count = 0
for(let i = 0; i < keys.length; i++){
count += 1
let item = keys[i]
const user = await this.getUser(item)
...//其他逻辑代码
if (user.isNewUser){
haveNew = true
}
if (count === keys.length) {
if (haveNew) {
return { haveNew }
}
}
}
}
备注:
- forEach 没有 break,使用会报错
- forEach 里面 return 无效(没有返回值),如果使用会有类似于 for 循环里面 continue 的效果
- forEach 在循环的过程中无法左右索引(有幕后黑手),但是 for 可以,有些同学在遍历数组的同时删除某项,需要注意 forEach
2、使用promise.all解决
async findNewUser(keys){
let haveNew = false
await Promise.all(keys.map(async item=>{
return new Promise(async (resolve,reject)=>{
try{
}catch(error){
reject(error)
}
})
})).then()
return { haveNew }
}