【问题标题】:Why is Array.push(element) not working sometimes?为什么 Array.push(element) 有时不起作用?
【发布时间】:2015-09-12 11:58:36
【问题描述】:

我在一个项目中使用 node.js,我的代码中有这种特定的结构,这会导致问题。我有一个包含 106 个项目的连续日期数组 dateArr。我有一个数组resultArr 来保存结果数据。我的代码结构是这样的:

function grabData(value, index, dateArr) {
  cassandra client execute query with value from dateArr {
    if (!err) {
      if (result has more than 0 rows) {
        process the query data
        push to resultArr
      }
      if (result is empty) {
        push empty set to resultArr
      }
    }
  }
}

dateArr.forEach(grabData);

我在每次迭代后记录了resultArr 的大小,似乎在某些迭代中没有任何东西被推送到resultArr。由于dateArrresultArr 之间的 I/O 结构是 1 比 1,所以应该存储 106 个项目时,代码仅在 resultArr 中存储了 66 个项目。

【问题讨论】:

  • 用伪代码很难分辨
  • 我很确定 cassandra client execute query with value from dateArr 是异步的。
  • 由于公司保密协议,无法提供真实代码,抱歉

标签: javascript arrays node.js serverside-javascript


【解决方案1】:

我在每次迭代后记录了 resultArr 的大小

grabData 方法被调用时,您会开始查询某处或某个名为 cassandra 的人。正如 Felix Kling 所写,您的符号似乎显示了一个异步函数,它启动请求并返回。

由于该函数是异步的,因此您不知道查询何时准备就绪。当数据库被锁定以进行转储时,这甚至可能需要很长时间。

当您从grabData“迭代”返回并检查您的resultArr 时,resultArr 将完全填充每个返回值。甚至可能是第五次迭代在第三次、第四次或之前的任何迭代之前返回一个查询。因此,在您的 resultArr 中,您有时会在某个点 m<no>n 具有迭代值 n

只要您(或我们)对 cassandra 的运作方式一无所知,您就无法确定查询何时得到答复。

因此,当您检查结果数组时,它会返回已完成查询的数量,而不是迭代次数。

【讨论】:

  • 有没有办法减少每次迭代返回完整查询所需的时间?
  • 您可以根据需要减少它。如果 cassandra 很慢,它永远不会在grabData 返回之前得到处理。当然,当 cassandra 只是一个返回常量值的 javascript 代理函数时,这样的速度可能就足够了。但这仍然取决于javascript vm中并行上下文的切换。无论如何,具有常量数据的代理函数不会返回太多有趣的数据。
  • 是的 - 但是,这里有最佳实践吗?
  • 不,异步结果的最佳实践是将它们视为未来某个时间发生的事情。没有人真正知道,因为可能有很多外部因素。要查看会发生什么,请在返回函数内添加一些日志记录,最好在 if(!err) 块后面。当然,通过将 cassandra 扩展到多个并行高速节点来提高速度通常会有所帮助。但这是某种蛮力。
【解决方案2】:

找到根本原因:使用 node.js 查询 Cassandra 时存在硬性限制。我试图完全执行的查询太大。将dateArr 分解成更小的块并使用这些更小的块进行查询解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2016-12-31
    • 2012-09-08
    • 2016-04-10
    • 2012-09-27
    • 2013-09-10
    相关资源
    最近更新 更多