Node.js 使用 async.forEach - 如何将列表传递给最终函数

Node.js using async.forEach - how to pass a list to the final function

我正在使用节点异步库 - https://github.com/caolan/async#forEach 并想遍历一个数组 (arrayOne),将结果推送到另一个 (productList),然后将该数组传递给最终函数。但是打印结果是一个空数组。

function Async(callback) {
    var productList = [];
    async.forEach(
        arrayOne,
        function(item, callback){
            getClientsNb({id:item["row"][0]},function (result) {
                productList.push(result)
            });
            callback();
        }, 
        function(err) {
            console.log(productList);
        }    
    );
}

"getCLientsNb" 函数是对 Neo4j 数据库的调用。

我想明白为什么结果是一个空数组。由于我是node.js的初学者,请您的回答非常清楚:)

你的问题是你把回调放在哪里。

function(item, callback)         
 { getClientsNb({id:item["row"][0]},function 
    (result) { productList.push(result) });
    callback(); }

执行 getClientsNb() 回调之前的外部函数 returns,因此您永远不会建立列表。您需要在该函数内移动回调:

function(item, callback){ getClientsNb({id:item["row"][0]},
    function (result) { 
            productList.push(result) 
            callback()});
}

如果您使用 async.map 而不是 forEach,那么您就不需要创建 productList。只需将第二个参数中的结果传递给回调,它将作为第二个参数传递给最终函数。