请教各位大神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 读取文件完成
异步代码执行顺序不一定,谁先执行完谁显示,不过你上面的代码,基本就那个顺序了
那请问哪里才是你所谓的异步代码?在调用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层面来说,大部分的异步来源于:
- process.nextTick
- setTImeout, setInterval
- 底层库(fs/net等)
看书里的事件循环概念。多看看书啊楼主……
嗯。谢谢兄台了。
介绍本书来嘛。
@KevinJay 补充一下,底层库带来的异步大部分是基于io的,网络io(net), 磁盘io(fs)