Node.js学习笔记(2)——关于异步编程风格

Node.js的异步编程风格是它的一大特色,在代码中就是体如今回调中。node

首先是代码的顺序执行:编程

function heavyCompute(n, callback) {异步

    var count = 0,异步编程

        i, j;函数

    for (i = n; i > 0; --i) {测试

        for (j = n; j > 0; --j) {spa

            count += 1; }线程

    }callback(count);code

}进程

heavyCompute(10000, function (count) {

    console.log(count);

});

console.log('hello');

这里输出100000000  hello,这个说明同一时间内只能执行一个函数,即便要花费多长时间,一个一个来。

可是,有两个有趣的例子:

一、

setTimeout(function () {

    console.log('world');

}, 1000);

console.log('hello');

输出helloworld,咱们能够这样理解,顺序执行的线程中,只要有一个函数设置了timeout以后,就会当即建立一个平行线程立马返回,而后让js主线程接着去执行后面的代码,在收到这个平行线程的通知以后,再执行回调函数。结果就是helloworld而不是在等待1s以后几乎同时出现worldhello。

 

2,下面这种状况就是很典型的一种:

function heavyCompute(n) {

    var count = 0, i, j;

    for (i = n; i > 0; --i) {

        for (j = n; j > 0; --j) {

            count += 1;

        }

    }

}

var t = new Date();

setTimeout(function () {

    console.log(new Date() - t);

}, 1000);

heavyCompute(50000);

在执行到setTimeout函数(或者setInterval这些常见的,这类函数还包括NodeJS提供的诸如fs.readFile之类的异步API。)的时候,看到有1000毫秒的延时设置,因而建立了一个平行线程以后立马去执行后面的代码,可是后面的代码花费的时间更多,因而你们一块儿等着后面的代码执行完毕、输出结果,再去执行原来的平行线程,而这个平行线程还要花费一秒以上。

为了验证平行线程里面的代码在node执行后面代码的时候有没有在后台偷偷执行,我就测试了如下代码:

function heavyCompute(n) {
var count = 0, i, j;
  for (i = n; i > 0; --i) {
    for (j = n; j > 0; --j) {
      count += 1;
      }
    }
  }
var t = new Date();
setTimeout(function () {
  heavyCompute(50000);//经过对这句话的注释与否,经过比较时间之间的差值,咱们就能够看出来平行线程到底有没有平行执行
  console.log(new Date() - t);
  }, 1000);
var t1 = new Date();
heavyCompute(50000);

console.log('a');
console.log(new Date() - t1);

结果证实,建立平行进程以后,谁也没有动它。

总结一下,js是单线程执行的,即便平行线程里面的函数执行完毕以后,回调函数也要等主线程执行完毕空闲的时候才能开始执行;

咱们仍然回到JS是单线程运行的这个事实上,这决定了JS在执行完一段代码以前没法执行包括回调函数在内的别的代码。

这个结论很重要,换句话说,node在同一时间内永远只能执行一段代码,碰到了settimeout这样的函数以后立马生成一个平行线程,而后就把这个平行线程放在那里不动继续去执行后面的函数,后面的函数执行完毕、主线程空闲以后,再回来从头执行这个平行线程以内的代码,这是一个专注的node.js,一点都不含糊。<未完待续>

相关文章
相关标签/搜索