nodejs具有异步编程思想吗?
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。

NodeJS最大的卖点--事件机制和异步IO,对开发者并不透明
代码设计模式
异步编程有很多特有的代码设计模式,为了实现同样的功能,使用同步方式和异步方式编写代码会有很大差异,以下举例。
1、函数返回值
使用一个函数的输出作为另一个函数的输入是常见的需求,在同步方式下一般以下述方式编写代码:
var output = fn1(fn2('input'));
// Do something;在异步方式下,由于函数执行结果不是通过返回值,而是通过回调函数传递,因此一般按以下方式编写代码:
fn2('input', function(output2) {
fn1(output2, function(output1) {
//Do something.
});
});注:这种方式就是一个函数套一个函数,层级变多了,就很麻烦了
2、遍历数组
在遍历数组时,使用某个函数依次对数据成员做一些处理也是常见的需求,若函数是同步执行,一般以下列方式:
var len = arr.length,
i = 0;
for(;i < len; ++i) {
arr[i] = sync(arr[i]);
}
//All array items have processed.若是异步执行,以上代码就无法保证循环结束后所有数组成员都处理完毕了,如果数组成员必须一个接一个串行处理,则按以下方式编写代码:
(function next(i, len, callback) {
if(i < len) {
async(arr[i], function(value) {
arr[i] = value;
next(i + 1, len, callback);
});
} else {
callback();
}
}(0, arr.length, function() {
// All array items have processed.
}));可以看到,在异步函数执行一次并返回执行结果后才传入下一个数组成员并开始下一轮执行,直到所有数组成员处理完毕后,通过回调的方式触发后续代码执行。
若数组成员可以并行处理,但后续代码仍然需要所有数组成员处理完毕后才能执行的话,则异步代码调整成以下形式:
(function(i, len, count, callback) {
for(;i < len; ++i) {
(function(i) {
async(arr[i], function(value) {
arr[i] = value;
if(++count === len) {
callback();
}
});
}(i));
}
}(0, arr.length, 0, function() {
//All array items have processed.
}));以上代码并行处理所有成员,并通过计数器变量来判断什么时候所有数组成员都处理完毕了。