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. 记一次 pip list --outdated 错误

    在 Windows CMD 执行 pip list --outdated,出现如下错误:" [WinError 10061] 由于目标计算机积极拒绝,无法连接",原因是我之前用的源 ...

  2. 【SPOJ694】Distinct Substrings (SA)

    求不相同子串个数    该问题等价于求所有后缀间不相同前缀的个数..也就是对于每个后缀suffix(sa[i]),将贡献出n-sa[i]+1个,但同时,要减去那些重复的,即为height[i],故答案 ...

  3. POJ2152 Fire 【树形dp】

    题目链接 POJ2152 题解 经典老题,还真暴力 \(n \le 1000\),所以可以\(O(n^2)\)做 所以可以枚举每个点依附于哪一个点 设\(f[u]\)表示以\(u\)为根的子树的最小代 ...

  4. imx6 PCIE使能加载ath9k无线网卡

    imx6q配置pcie无线网卡遇到如下问题: imx6q-pcie 1ffc000.pcie: PCI host bridge to bus 0000:00 pci_bus 0000:00: root ...

  5. webpack编译vue出现dev警告

    alias配置 vue < 2.1.0 module.exports = { ... resolve: { alias: { 'vue$': 'vue/dist/vue.js' } }, ... ...

  6. jmeter的参数化方法汇总

    一.User Defined Variable 1.添加的位置 Add->Config Element->User Defined Variable 2.使用 变量phone添加成功后,在 ...

  7. ThickBox弹出框的使用方法

    原文发布时间为:2009-08-22 -- 来源于本人的百度文章 [由搬家工具导入] 请访问:http://www.blueidea.com/articleimg/2007/12/5182/tickb ...

  8. shell特殊符号用法大全

      # 注释符号(Hashmark[Comments]) 1.在shell文件的行首,作为shebang标记,#!/bin/bash; 2. 其他地方作为注释使用,在一行中,#后面的内容并不会被执行, ...

  9. 汉化CodeBlock

    codeblock最新版本发布了,但是对一些看不惯英文的来说,还是中文好点. 一.准备工作,先下载codeblock最新版,可以从官方下载,也可以从http://www.uzzf.com/soft/1 ...

  10. [SaltStack] 基础介绍

    今天有时间把以前研究过的saltstack梳理总结下 -:) salt是干什么的我就不多说了, 大家Google下资料很多的, 简单来说就是func+puppet: 配置文件管理 远程命令调用 Cro ...