nodejs中简单实现Javascript Promise机制的实例
promise/deferred是一个很好的处理异步调用编码的规范,下面以nodejs代码为类,来实现一个promise/A规范的简单实现
/** *CreatedwithJetBrainsWebStorm. *User:xuwenmin *Date:14-4-1 *Time:上午9:54 *TochangethistemplateuseFile|Settings|FileTemplates. */
varEventEmitter=require('events').EventEmitter; varhttp=require('http'); varutil=require('util'); //定义promise对象 varPromise=function(){ //实现继承事件类 EventEmitter.call(this); } //继承事件通用方法 util.inherits(Promise,EventEmitter); //then方法为promise/A规范中的方法 Promise.prototype.then=function(successHandler,errorHandler,progressHandler){ if(typeofsuccessHandler=='function'){ this.once('success',successHandler); } if(typeoferrorHandler==='function'){ this.once('error',errorHandler); } if(typeofprogressHandler==='function'){ this.on('process',progressHandler); } returnthis; }
//定义延迟对象 //包含一个状态和一个promise对象 varDeferred=function(){ this.state='unfulfilled'; this.promise=newPromise(); } Deferred.prototype.resolve=function(obj){ this.state='fulfilled'; this.promise.emit('success',obj); } Deferred.prototype.reject=function(err){ this.state='failed'; this.promise.emit('error',err); } Deferred.prototype.progress=function(data){ this.promise.emit('process',data); }
//利用一个http请求来运用上面定义的promise/deferred
varclient=function(){ varoptions={ hostname:'www.baidu.com', port:80, path:'/', method:'get' }; vardeferred=newDeferred(); varreq=http.request(options,function(res){ res.setEncoding('utf-8'); vardata=''; res.on('data',function(chunk){ data+=chunk; deferred.progress(chunk); }); res.on('end',function(){ deferred.resolve(data); }); }); req.on('error',function(err){ deferred.reject(err); }) req.end(); returndeferred.promise; } client().then(function(data){ console.log('请求完成',data); },function(err){ console.log('访问错误',err); },function(chunk){ console.log('正在读取',chunk); });