Node.js 异步数组迭代

Posted

技术标签:

【中文标题】Node.js 异步数组迭代【英文标题】:Node.js async array iteration 【发布时间】:2016-07-10 04:23:24 【问题描述】:

我正在尝试使用 async.each 同步迭代数组:

async.each(supplier_array, function(supplier) 
    console.log('looking at : ' + supplier);
    knex(host_name + '.order_item').where(
        supplier: supplier,
        order_id: order_id
    ).then(function(data) 
        console.log(data);
        knex(host_name + '.distributor').select()
        .then(function(data) 
            console.log(data);
        ).catch(function(error) 
            console.log('error: ' + error);
        );
    ).catch(function(error) 
        console.log('error: ' + error);
    );
);

我的supplier_array 有 3 个元素。所以应该发生的是应用程序应该(同步):

对于供应商 1/第一个 arr/第一个数组元素:

console.log(供应商) console.log(order_item) console.log(发行商)

对于供应商2/第二个数组元素:

console.log(供应商) console.log(order_item) console.log(发行商)

对于供应商 3/第三个数组元素:

console.log(供应商) console.log(order_item) console.log(发行商)

但是,它是异步操作的:

console.log(供应商) console.log(供应商)

console.log(供应商)

console.log(order_item)

console.log(order_item)

console.log(order_item)

console.log(发行商)

console.log(发行商) console.log(发行商)

有人可以帮我实现同步运行async里面的步骤的预期效果吗?

提前致谢!

【问题讨论】:

您可能必须对每个 knex 承诺进行“退货”。这承认 async 让它知道有一个要处理的承诺。试试看,如果它是正确的答案,请告诉我。我自己遇到了这个问题。此外,您可以将第 9 行的内部“then”移出一个级别,因为您正在返回一个承诺。 【参考方案1】:

如果你想以串行顺序迭代它们,你应该使用async.eachSeries。试试这样的:

async.eachSeries(supplier_array, function(supplier, callback) 
    console.log('looking at : ' + supplier);
    knex(host_name + '.order_item').where(
        supplier: supplier,
        order_id: order_id
    ).then(function(data) 
        console.log(data);
        knex(host_name + '.distributor').select()
        .then(function(data) 
            console.log(data);
            callback(); // Advance to next iteration here
        ).catch(function(error) 
            console.log('error: ' + error);
            callback(error); // Also callback when error occurs
        );
    ).catch(function(error) 
        console.log('error: ' + error);
        callback(error); // Also callback when error occurs
    );
);

【讨论】:

谢谢 - 确认 - callback() 会告诉它查看下一个供应商,并将所有这些流程应用于下一个供应商? 它似乎是这样工作的。此外,您还应该注意 async.js 的 README 中记录的一个常见陷阱:github.com/caolan/async#synchronous-iteration-functions

以上是关于Node.js 异步数组迭代的主要内容,如果未能解决你的问题,请参考以下文章

Node.js生成器,迭代器以及异步操作

node.js 在间隔中迭代数组特定时间

异步 node.js:带有回调的嵌套数组

这是因为Node.js的异步性质还是有任何其他方法来实现这一点?

在 Node.js 的异步函数中填充数组

Node.js如何将数组索引传递给异步函数