求解node.js的异步机制
发布于 2年前 作者 kevinjay 3338 次浏览

请教各位大神node.js代码的执行顺序是从上往下吗?当遇到callback的时候就异步执行代码,但是没有遇到callback的时候呢,是从上往下执行的? 我的测试代码如下:

 console.log('test1');
console.log('test2');
var fs = require('fs');
fs.readFile(this.CONFIG.LOG_PATH + '/test.txt', 'utf8', function(error, result){
    console.log('读取文件完成');
});
console.log('test3');

执行结果如下: test1 test2 test3 读取文件完成

14 回复

异步代码执行顺序不一定,谁先执行完谁显示,不过你上面的代码,基本就那个顺序了

那请问哪里才是你所谓的异步代码?在调用callback的时候?那没调用callback的时候是同步代码还是异步代码呢?

@KevinJay function(error, result){ console.log(‘读取文件完成’); });

node里面有句话是这样说的:除了你的代码,一切都是异步的。

没有callback是同步,有一般就是异步

我也是这么理解的。

求详解。。

@mz121star 那就是调用callback的时候才是异步的嘛。。

@KevinJay 其实你想想这样的代码:var t; t="ttt";这可能不按顺序执行吗 除了你的代码,一切都是异步。比如你去读数据库、读文件这些都是异步执行的,执行完之后就执行回调函数。

并不是所有的callback都是异步,这个是看具体代码实现的。但是node的约定是callback需要是异步的,保证风格的统一。

function getByUid(uid, callback) {
  if (!uid) {
    //同步返回的callback
    return callback(new Error('need uid'));
  }
  //这里callback可能是异步的
  db.note.getByUid(uid, callback);
}

这种风格的代码可能导致误解。好的实现在下面,保证callback是异步返回的。

if (!uid) {
  return process.nextTick(function () {
    callback(new Error('need uid'));
  });
}

关于异步的原理,是基于事件循环的,底层的实现稍微复杂,但是在node层面来说,大部分的异步来源于:

  1. process.nextTick
  2. setTImeout, setInterval
  3. 底层库(fs/net等)

看书里的事件循环概念。多看看书啊楼主……

嗯。谢谢兄台了。

介绍本书来嘛。

@KevinJay 补充一下,底层库带来的异步大部分是基于io的,网络io(net), 磁盘io(fs)

回到顶部