Node.js 异步编程
来源:互联网 发布:上海java工程师待遇 编辑:程序博客网 时间:2024/05/15 03:10
了解Node.js的人都知道,node.js 最大的魅力之处就在于非阻塞I/O 以及事件驱动机制。JavaScript脚本语言的一个特征是它只支持单线程。V8 JavaScript脚本语言也是如此,因此不需要担心死锁现象。但是与客户端脚本语言不同的是,Node.js 中V8 JavaScript脚本语言提供了非阻塞的I/O机制。比如:我在访问数据库取得搜索结果的时候,在开始访问数据库之后,数据库返回结构之前,存在一段等待时间。在传统的单线程处理机制中,在执行访问数据库代码之后,整个线程都会暂停下来,等待数据库返回查询结果之后才能继续执行器后面的代码。也就是说,I/O操作阻塞了代码的执行、极大的降低了程序的执行效率。由于Node.js采用了非阻塞的I/O机制,因此在执行了访问数据库的代码之后将立即转而执行其后面的代码,把数据库返回的结果的代码放在回调函数中执行,从而提高了程序的执行效率。
虽然说在node.js中,在一个时刻只能执行一个事件回调函数,但是在执行一个事件回调函数的中途可以转而处理其他事件(包括触发新的事件、声明该事件的回调函数等),然后返回继续执行原事件回调函数,这种处理机制成为事件环机制。
下面就对于node.js的异步编程做一个总结:
一、什么是异步编程?
nodejs异步编程是指执行到一个方法的时候,不立即执行,而是加入到队列,然后接着往下执行,nodejs内部是适时执行队列的方法,执行完执行回调方法(如果有回调方法)。由于只node.js 是单线程,异步编程模型保证了nodejs快速响应,充分利用CPU。
eg:
// 同步filenames = fs.readdirSync('.');for(var i=0;i<filenames.length;i++){ console.log(filenames[i]);}console.log("Current uid:"+process.getuid()); // 异步fs.readdir('.',function(err,filenames){ var i ; for(var i=0;i<filenames.length;i++){ console.log(filenames[i]); }});console.log('Current uid:'+process.getUID());二、回调函数只能且必须执行一次
eg:
<span style="white-space:pre"></span>function abc(arg,callback){asyncMethod(function(err,result){if(err){return callback();} callback();})}
三、多层回调函数解决方案
如何是实现nodejs异步方法的同步调用:
(1).解决for循环问题
var async = require('async');async.forEach(array,function(item,callback){ console.log('1.1 enter :'+item.name); setTimeout(function(){ callback(null,item.name); },function(err){ console.log('1.1 err:'+err); });});其中,forEach方法能保证里面的调用顺序,只有执行了回调函数callback才会执行写一个元素的调用。
(2). 多个异步方法都实行完才进行操作:
async.parallel({a: function(cb) {asyncMethod1(function(err,result){ cb(err,result); }); },b: function(cb) { asyncMethod2(function(err,result) { cb(err,result); }); }},function(err,results){console.log('err : ',err);console.log('results :',results)});多个方法同时执行,同时把返回结果放到results里,如果有一个方法执行失败,立即停止所有方法执行,如果全部正确,results.a 即asyncMethod1 的返回结果;results.b 即 asyncMethod2 的返回结果。
- node.js异步编程
- Node.js 异步编程
- Node.js 异步编程
- Node.js[1] 异步编程
- Node.js 异步编程之 Callback
- node.js 异步编程解决方法 了解一
- Node.JS的异步编程风格
- Node.js 异步编程之 Callback介绍
- Node.js中同步函数异步编程
- Node.js异步编程,promise,fibers
- Node.js 异步编程基础理解
- 深入理解node.js异步编程:基础篇
- Node.js 异步式 I/O 与事件式编程
- 理解Node.js的事件驱动和异步编程
- node.js异步IO和事件式编程
- Node.js 异步式 I/O 与事件式编程
- node.js异步式IO与事件式编程
- Node异步编程体验
- LeetCode——014
- 2016.4.15晚周记1
- 统计一个数中1的个数
- TCP三次握手以及释放连接
- 浙江大学引进首台具主动屏蔽技术7T磁共振设备
- Node.js 异步编程
- 排序算法---1
- 从频率到意义:语义向量空间模型(1)(From Frequency to Meaning: Vector Space Models of Semantics)
- 栈的应用-表达式求值
- Android--Camera.addCallbackBuffer/setPreviewCallbackWithBuffer模式使用总结
- 前20名的不安全密码(需要避免)
- MVC、MVP、MVVM的区别
- 【NOIP practice】BSOJ1878 山头狙击战 二分
- hdu 1233 还是畅通工程 最小生成树prim