节点同步运行,等待循环完成

问题描述:

我在项目中已经列举了一些问题,因为节点是异步的,但现在我有一个for loop,并且我在循环结束或休息之后做了一些事情,看起来好像同步工作,我想知道为什么。节点同步运行,等待循环完成

我有这样的代码:

  var newItem = true; 

      for (var i = 0; i < cart.length; i++) { 
       if (cart[i].title == slug) { 
        cart[i].qty++; 

        newItem = false; 
        break; 
       } 
      } 

      if (newItem) { 
       cart.push({ 
        title: slug 
       }); 
     } 

而这一切按预期工作! newItem变量始终具有正确的值。

怎么新来的东西不总是true

我从来没有在cart数组中有超过3个项目,这是为什么?如果我有1000件物品,它会有不同的表现吗?

+0

这个代码是同步的,这就是为什么 – marvel308

+0

似乎但是我没有认为它应该表现如此。我在另一个实例中有一个for循环,并在循环内部更新了数据库,并且在循环之后也得到了一些结果,并且它不能同步工作,我不得不使用回调来创建一个函数。 –

你提供的同步运行,如果你想测试它是否工作在异步状态下尝试运行该代码的代码

var newItem = true; 

for (var i = 0; i < cart.length; i++) { 
    setTimeout(function(){ 
     if (cart[i].title == slug) { 
      cart[i].qty++; 

      newItem = false; 
      break; 
     } 
    }, 1000); 
} 

if (newItem) { 
    cart.push({ 
     title: slug 
    } 
} 
+0

我有类似的代码,其中数据库正在循环内部更新,循环完成后,我从数据库中得到结果,但结果总是落后一步,代码与此类似。从数据库获取结果的代码并没有等待循环完成,所以我不明白为什么'if(newItem)'在这里等待循环结束。 –

+0

这里的代码是如何形成代码的问题在这里https://*.com/questions/45484161/locals-variable-not-updating-correctly? –

+0

在这个例子中,if会在for循环之后运行,但是因为它正在进行异步调用,所以setTimeout内部的部分至少会在1秒之后发生,因此在循环完成后newItem最初会是假的 – marvel308