【问题标题】:Node acting synchronously, waiting for the loop to finish节点同步动作,等待循环结束
【发布时间】:2017-08-11 07:21:11
【问题描述】:

由于节点是异步的,我在做的项目中遇到了一些问题,但现在我有一个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 变量始终具有正确的值。

newitem 怎么不总是true

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

【问题讨论】:

  • 这段代码是同步的,这就是原因
  • 似乎但我认为它不应该这样。我在另一个实例中有一个 for 循环,并在循环内更新数据库,并在循环后得到一些结果,但它不能同步工作,我必须创建一个带有回调的函数。

标签: node.js


【解决方案1】:

您提供的代码是同步运行的,如果您想测试它是否在异步条件下工作,请尝试运行此代码

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
    }
}

【讨论】:

  • 我有类似的代码,其中数据库正在循环内更新,循环完成后我从数据库中得到结果,但结果总是落后一步,代码与此类似。从 db 获取结果的代码没有等待循环完成,所以我不明白为什么这里的if (newItem) 正在等待循环完成。
  • 这里的代码与stackoverflow.com/questions/45484161/…问题中的代码有何不同?
  • 在这个例子中 if 将在 for 循环之后运行,但是由于它正在进行异步调用,因此 setTimeout 内的部分至少会在 1 秒后发生,因此 newItem 在循环完成后最初将为 false
  • 别管设置超时部分,我说的是没有它,因为我在我的 q 中有它。为什么这里的if 在循环之后运行,而这里的stackoverflow.com/questions/45484161/… 却没有?
  • 他们的解决方案使用回调来处理循环完成后应该发生的事件,因此在 for 循环完成执行后调用回调,以便接收最新更新
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 2022-01-16
  • 2021-03-02
  • 2017-05-03
  • 2019-08-18
  • 2016-12-26
  • 2017-12-24
  • 2021-10-03
相关资源
最近更新 更多