Javascript 嵌套异步ForEach循环

Javascript 嵌套异步ForEach循环,javascript,node.js,asynchronous,foreach,node-async,Javascript,Node.js,Asynchronous,Foreach,Node Async,我有两个嵌套的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],

我有两个嵌套的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_数据是一个对象数组,第一个forEachOf循环应该迭代final_数据对象,对于每个对象,应该运行第二个嵌套forEach,创建一个具有修改值的新对象,并将其推回到对象的final_数据数组中。 我遇到的问题是,函数总是在不同的时间返回,因此最终_数据的长度总是不同的,一次推送100个对象,一次推送670个对象。所以基本上,在处理完所有对象并且两个for循环完成后,应该调用主函数中的回调函数addValue

奇怪的是,使用非异步代码会导致无限循环

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相比,无限标准循环的原因可能是什么?

如果您有es6支持,您可以尝试此方法

async 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]];
var result =[]
for(item of final_data)
   for (const value of values) {
     var obj = Object.assign({},item);
                obj.x+=value[0];
                obj.y+=value[1];
          await result.push(obj);
   }
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);
}

这里似乎没有任何异步代码,所以您尝试进行异步编码有什么原因吗?您想用新obj调用回调并获得结果吗?这就是您需要的吗?为了使用Wait for callback1,我也必须在forEachOf中使用异步,对吗?因为否则,它将抛出一个错误,即wait仅在异步函数中有效,即使更高的作用域函数是async@nivendha代码的目的是为最终_数据数组的每个元素创建N个不同的副本,并将其推回主最终_数据数组,并将其返回到函数addValue所在的位置被称为…@KristijanStefanoski那么你认为什么是使用承诺所需要的。?只需返回最终的_数据;,你甚至不需要使用回调函数。@KristijanStefanoski这根本不需要异步函数,我想好了,所以我使用了非异步函数,由于某种原因,我最终进入了一个无限循环,你可以检查上面的更新。