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

首先是代码的顺序执行:

function heavyCompute(n, callback) {

var count = 0,

i, j;

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

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

count += 1; }

}callback(count);

}

heavyCompute(10000, function (count) {

console.log(count);

});

console.log('hello');

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

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

1、

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,一点都不含糊。<未完待续>

Node.js学习笔记(2)——关于异步编程风格的更多相关文章

  1. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  2. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  3. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  4. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  5. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  6. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

  7. Node.js学习笔记(一):快速开始

    最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...

  8. Node.js学习笔记(1) - Node.js简介

    近期在看一些Node.js的知识,看完后觉得,一些前面的东西忘记了,于是整理一下,方便自己查阅,也希望对学习Node.js的朋友有些帮助: 当然以下只是我个人的观点和理解,不喜勿喷,也望大神指教. 一 ...

  9. Node.js学习笔记 02 Implementing flow control

    What is flow control? 和其它语言一样,Node.js 在代码编写时,如何组织代码,如何写出clean code都是不可避免的难点. 同时,由于Node.js的天然特性(异步,事件 ...

随机推荐

  1. HDU 5696 RMQ+滑窗

    区间的价值 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  2. 当时用vuex的时候,使用...对象展开扩展符报错的解决办法

    出现这种问题的主要原因是当前的babel不支持...对象展开扩展符,只需要安装一个插件然后再在.babelrc当中进行下配置就好了 npm i babel-plugin-transform-objec ...

  3. 常用“Request.ServerVariables()”汇总

    原文发布时间为:2009-10-25 -- 来源于本人的百度文章 [由搬家工具导入] Request.ServerVariables("REMOTE_ADDR")         ...

  4. 遍历datalist中的checkbox,并获取此时的值

    原文发布时间为:2009-04-29 -- 来源于本人的百度文章 [由搬家工具导入] protected void Page_Load(object sender, EventArgs e) { if ...

  5. 【jetty】Jetty与Tomcat的区别

    Jetty 的架构从前面的分析可知,它的所有组件都是基于 Handler 来实现,当然它也支持 JMX.但是主要的功能扩展都可以用 Handler 来实现.可以说 Jetty 是面向 Handler ...

  6. hdu 3518 Boring counting 后缀数组 height分组

    题目链接 题意 对于给定的字符串,求有多少个 不重叠的子串 出现次数 \(\geq 2\). 思路 枚举子串长度 \(len\),以此作为分界值来对 \(height\) 值进行划分. 显然,对于每一 ...

  7. 安装配置Vim中文帮助文档

    1.home/.vimrc是用户自己的vim配置文件,在这个配置文件中设置的配置只影响该用安装前的准备工作: 在home目录下列新建文件夹  : .vim ------------------> ...

  8. FZU 1077 铁皮容器 【枚举/二分】

    Accept: 1040    Submit: 2314Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 使用白 ...

  9. Codeforces Round #464 (Div. 2) A. Love Triangle[判断是否存在三角恋]

    A. Love Triangle time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  10. Codeforces 632F Magic Matrix(bitset)

    题目链接  Magic Matrix 考虑第三个条件,如果不符合的话说明$a[i][k] < a[i][j]$ 或 $a[j][k] < a[i][j]$ 于是我们把所有的$(a[i][j ...