nodejs中简单实现Javascript Promise机制的实例

promise/deferred 是一个很好的处理异步调用编码的规范,下面以nodejs代码为类,来实现一个promise/A 规范的简单实现


/**

 * Created with JetBrains WebStorm.

 * User: xuwenmin

 * Date: 14-4-1

 * Time: 上午9:54

 * To change this template use File | Settings | File Templates.

 */

var EventEmitter = require('events').EventEmitter; var http = require('http'); var util = require('util'); // 定义promise对象 var Promise = function(){     // 实现继承事件类     EventEmitter.call(this); } // 继承事件通用方法 util.inherits(Promise, EventEmitter); // then 方法为promise/A 规范中的方法 Promise.prototype.then = function(successHandler, errorHandler, progressHandler){     if (typeof successHandler == 'function'){         this.once('success', successHandler);     }     if (typeof errorHandler === 'function'){         this.once('error', errorHandler);     }     if (typeof progressHandler === 'function'){         this.on('process', progressHandler);     }     return this; }

// 定义延迟对象 // 包含一个状态和一个promise对象 var Deferred = function(){     this.state = 'unfulfilled';     this.promise = new Promise(); } 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

var client = function(){     var options = {         hostname:'www.baidu.com',         port:80,         path:'/',         method: 'get'     };     var deferred = new Deferred();     var req = http.request(options, function(res){         res.setEncoding('utf-8');         var data = '';         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();     return deferred.promise; } client().then(function(data){     console.log('请求完成', data); }, function(err){     console.log('访问错误', err); }, function(chunk){     console.log('正在读取', chunk); });

代码保存为promise.js,可以在命令行下面运行,直接输入node promise.js,即可看到运行效果。