【问题标题】:An easy way to ensure the right sequence in forEach / for loop in Javascript?一种确保 Javascript 中 forEach / for 循环中正确顺序的简单方法?
【发布时间】:2018-03-01 11:28:25
【问题描述】:

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

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

【问题讨论】:

  • Async.js 有方便的方法来做到这一点。
  • response = await database.write(statement)

标签: javascript node.js asynchronous foreach waterfall


【解决方案1】:

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

不要使用 for 循环。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    数据库中的非结构化数组存在问题,forEach 中没有问题

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

    【讨论】:

    • 或者当你从数据库中获取它时自己订购它,然而,这很少是谨慎的。
    • @MortenBork 在 DB 响应后代码排序不正确,您应该编写带有分页和排序的 SQL 查询
    • @alex dykyi 所以如果我正在编写一个被许多不同接口使用的查询,我必须预先订购它们吗?这是什么废话?这取决于结果将用于什么。这是广泛发表声明的方式。如果甚至不需要分页怎么办?那我还应该实施吗?
    • @MortenBork 分页不是必需的,但对于许多查询来说,如果您有大量来自 DB 的数据列表,则可以使用它
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 2015-07-04
      • 1970-01-01
      相关资源
      最近更新 更多