节点js - 代码无效

时间:2016-10-06 15:39:45

标签: node.js asynchronous

我正在执行以下代码。

var sum = 0;

var calculateSum = function(input) {
    for(var i=0;i<input;i++) {
        sum+=i;
    }
    console.log("Calculated sum for " + input);
    return sum;
}

function calculateValue(data, callback) {
    callback(data);
}

calculateValue(5000000,calculateSum);
while(sum<5) {
    console.log("Still calculating sum!!!");
}

console.log("Calling third");

我希望输出为

  

拨打第三个

     

仍在计算总和

     

5000000的计算总和

但是,输出是

  

5000000的计算总和

     

拨打第三个

它与同步编程相同。请告诉我我做错了什么。

谢谢,

迪夫亚

5 个答案:

答案 0 :(得分:1)

使用回调不会使代码异步,并且您必须了解Javascript是单线程的(大多数情况下),因此您的代码所做的是:

  1. 致电content : "\200C";
  2. calculateValue来电calculateValue
  3. 执行calculateSum并显示其有效负载
  4. 然后检查while条件。结果是错误的,因此不会执行它的块
  5. 执行最后一行,将该消息添加到控制台。

答案 1 :(得分:0)

您先致电calculateValue(5000000,calculateSum);。唯一console.log()位于console.log("Calculated sum for " + input);。 因此,这将是调用此方法时记录的唯一内容,这也会将sum更改为> 5。 然后,您比较sum < 5,但由于您之前的函数调用,sum已经> 5。 你调用的最后一件事是console.log("Calling third");,所以人们会期望这是最后一件事。

答案 2 :(得分:0)

代码中的所有内容都是同步的。 Javascript逐行执行代码。这就是脚本执行将等待calculateSum函数完成执行,在其中打印日志语句然后移动到下一行的原因。由于(sum&lt; 5)条件为false,它直接打印最后一个console.log语句。这就是你的脚本运行的方式:

  1. 初始化sum = 0。
  2. 调用函数calculateValue(5000000,calculateSum);
  3. 从calculateValue函数调用calculateSum函数。
  4. 在calculateSum函数内部,循环遍历来自0的给定输入并记录第一个console.log语句,即

    console.log(“+输入的计算总和”; 5.评估(总和&lt; 5),当总和值已经改变时返回false,所以跳过while循环。

  5. 记录最终的console.log语句,即

    console.log(“Calling third”);

答案 3 :(得分:0)

输出似乎正确。它首先调用computedValue(),它打印“计算的5000000的总和”,因为sum是&gt; 5这样就跳过了while循环。然后记录最终消息。如果你想要并行编程或延迟编程。你可以使用Timer。

答案 4 :(得分:0)

谢谢你的回复。

我想我可能已经理解了Node JS的根本错误。如果我的理解错误,请向我纠正。

  

calculateValue(),while()和console.log()被视为三   单独执行。

     

因此,无论先完成哪一项都写入控制台。

     

由于calculateValue()需要一些时间才能完成,而()和   console.log()首先完成执行并写入控制台。

我创建了calculateValue()作为readFromDB()的替代品。所以,流程应该是

  

readFromDB(),while()和console.log()被视为三个   单独执行。

     

因此,无论先完成哪一项都写入控制台。

     

因为readFromDB()需要一些时间来完成,而()和   console.log()首先完成执行并写入控制台。

这不应该是Node JS的主要优势。即如果从DB读取需要很长时间,系统可以继续执行其他操作,如接受用户输入/执行不相关的计算。

谢谢, 迪夫亚