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,即可看到运行效果。
相关文章
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
 - 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
 - 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
 - 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
 - ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
 
        
    		
            	
        
        
        