在Javascript中确保forEach / for循环的正确顺序的简单方法?

时间:2018-03-01 11:28:26

标签: javascript node.js asynchronous foreach waterfall

我的node.js应用程序中有以下函数,它循环遍历数组并对其执行某个函数:

var splitStatements = ['1','2','3']; // this is simplified

splitStatements.forEach(function(statement) {  

    // `statement` is written into the database 
    // the response is obtained and modified as `response`

    console.log(response);

});

我如何确保无论forEach函数内部的函数有多复杂,都会逐个处理数组的每个元素,以便结果输出类似于

1 modified
2 modified
3 modified

实际上我有时会得到像

这样的东西
1 modified
3 modified
2 modified

取决于splitStatements数组的每个元素的复杂程度。

我理解上述情况发生是因为代码执行是异步的,那么确保在异步执行时,每个下一个程序确保前一个程序已经执行以便启动的最佳实践方法是什么?

3 个答案:

答案 0 :(得分:1)

如果您插入数据的顺序非常重要,那么您需要等待每个查询完成后再发送下一个查询。

不要使用for循环。

编写一个函数,将数组中的 next 项设置为数据库。直接调用该函数,然后再次在回调中调用异步数据库调用完成。

包含测试,以便在数组中的项目用尽时停止!

如果您不需要保留数组的内容,可以使用arr.unshift()获取下一个项目。如果你没有得到结果,你就到了最后。

如果需要保留数组,则使用变量(传统的i)来跟踪您所在的数组索引。每次增加一个。

function insert_into_database() {
    var item = arr.unshift();
    if (item) {
        add_to_database(item).then(insert_into_database);
    }
}

答案 1 :(得分:0)

数据库中非结构化数组中的问题,问题不在forEach

您需要使用排序或订单选项向数据库发送查询

答案 2 :(得分:0)

我找到了一个解决方案:我只是为进入数据库的每个statement添加时间戳,每个时间点加上几毫秒(等于此语句在数组中的位置)。所以,如果它是第1个,我加1,如果第2个我加2,等等。

然后当我从数据库中提取这些语句时,我只是按这个时间戳排序它们(已经是这种情况)。