如果您同时修改在节点js中循环的数组会发生什么?

时间:2017-02-04 02:35:46

标签: javascript arrays node.js loops

我是节点js的新手,我只是习惯了语言的异步性......

我有一个函数,每隔60秒更新数组 A 中的值(从数据库中获取它们)。

我还有一个处理来自用户请求的函数,在处理这些请求时,它使用 A 中的值(因此我循环遍历 A )。

我想知道这种类型的异步会让我的应用程序崩溃吗?

例如,如果我正在循环 A 并抓取值,但同时,60秒计时器会点击并开始更新 A中的值,有什么不好的事情发生吗?

如果是这样,你有任何设计建议可以避免这种情况吗?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

你可能会遇到这样的奇怪错误。如果你在A的中间,A变得更短,它将终止循环。例如,假设A有30个元素。在循环时,当你在索引16时,它会变为长度15.它不会继续循环。另一个例子。假设A的长度为2.当您完成第一个索引的内容时,当您转到第二个索引时,两个索引的值都会更改,然后第一个将报告为旧值,第二个报告为新价值。

答案 1 :(得分:0)

这实际上取决于您的确切代码,因此如果不了解并了解您的确切代码,就无法提供具体答案。

node.js中的Javascript是单线程的,因此如果您使用.forEach()for循环等同步机制循环数组,则会启动您所做的任何异步调用,但它们无法完成,直到你当前的执行线程(包括通过数组的循环)完全完成。因此,当您仍在循环时,没有异步结果会影响阵列。

迭代数组的常规和异步方法较少。如果您使用其中之一,我们必须查看您的实际代码,以便就是否存在任何并发问题提供意见。

  

例如,如果我正在循环A并抓取值   但与此同时,60秒定时器点击并开始更新   A中的值可以发生什么不好的事情吗?

node.js是事件驱动的。这意味着当计时器准备好触发时,它会将事件插入node.js事件队列。在完成当前运行的Javascript并且node.js JS引擎然后可以将下一个事件从事件队列中拉出之前,将不会处理该事件。因此,计时器不会中断当前正在运行的Javascript。