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

问题描述 投票:0回答:3

我在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数组的每个元素的复杂程度。

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

javascript node.js asynchronous foreach waterfall
3个回答
1
投票

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

不要使用for循环。

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

包括测试,以便在阵列中的项目用完时停止!

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

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

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

0
投票

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

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.