首页 > 解决方案 > 嵌套的异步 ForEach 循环

问题描述

我有两个嵌套的 forEach 循环,我尝试使用标准 forEach 和一些自己的逻辑但它失败了,然后我尝试了来自 npm 的异步库,代码如下:

function addValue(data, callback){
    var final_data = [];
    data.forEach(element => {
        final_data.push(element);
    });
    var values = 
    [[1,0],
    [2,0],
    [3,0],
    [-1,0],
    [-2,0],
    [-3,0],
    [1,1],
    [2,1],
    [3,1],
    [-1,1],
    [-2,1],
    [-3,1]];
    async_.forEachOf(final_data, (item, {}, callback1) => {
        values.forEach(value=>{
            var obj = Object.assign({},item);
                    obj.x+=value[0];
                    obj.y+=value[1];
                    final_data.push(obj);
        });
        callback1();
    }, err => {
        if (err) console.error(err.message);
        // Here i get different values for separate executions with same data
        console.log(final_data.length)
    });
}

我想要实现的是 final_data 是一个对象数组,第一个 forEachOf 循环应该遍历 final_data 对象,并且每个循环都应该运行第二个嵌套的 forEach 创建一个具有修改值的新对象并将其推回 final_data对象数组。我遇到的问题是函数总是在不同的时间返回,因此 final_data 的长度总是不同的,一旦 100 个对象被推送,一次 670。所以基本上应该调用主函数中的回调,即 addValue所有对象都被处理,两个 for 循环完成......

使用非异步代码最终陷入无限循环,奇怪

function addValue(data, callback){
    var final_data = [];
    data.forEach(element => {
        final_data.push(element);
    });
    var values = 
    [[1,0],
    [2,0],
    [3,0],
    [-1,0],
    [-2,0],
    [-3,0],
    [1,1],
    [2,1],
    [3,1],
    [-1,1],
    [-2,1],
    [-3,1]];
    for(var i=0; i<final_data.length; i++){
        for(var j=0; j<values.length; j++){
            var obj = Object.assign({},final_data[i]);
            obj.x+=values[j][0];
            obj.y+=values[j][1];
            final_data.push(obj);
            console.log(final_data.length)
        }
    }
}

编辑 2: 使用没有异步的 forEach 工作......与 forEach 相比,无限标准循环的原因可能是什么?

标签: javascriptnode.jsasynchronousforeachnode-async

解决方案


假设你有 es6 支持,你可以试试这个

function addValue (data) {
 var values = 
[[1,0],
[2,0],
[3,0],
[-1,0],
[-2,0],
[-3,0],
[1,1],
[2,1],
[3,1],
[-1,1],
[-2,1],
[-3,1]];
var finalData = data.map((item)=>{
   return values.map(function(value) {
        var obj = Object.assign({},item);
                obj.x+=value[0];
                obj.y+=value[1];
        return obj;         
   })  
});
return finalData.flat(2);
}

推荐阅读