Javascript 流程控制

285 阅读1分钟

本文主要是记录自己项目中遇到的问题,程序因为执行顺序没有按照期望运行

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 }
}