我对Defer and Promise的实现

var events = require("events");
var util= require("util");
var EventEmitter = events.EventEmitter;

var Defered = function(){
	this.promise = new Promise();
};
/*
 * 从第一个defer对象的promise的queue中取出handler并执行
 * 如果这个hanler返回一个proimse对象,则把第一个defer对象的promise的queue复制给这个返回
 * 的promise对象,并且把第一个defer对象的Promise更新为这个返回的promise对象,从而能在第一个
 * 对象的promise上实现链接调用
 *
 */
Defered.prototype.resolve = function(obj){
	var promise = this.promise;
	var handler;
	while((handler = promise.queue.shift())){
		if(handler && handler.fulfilled){
			var ret = handler.fulfilled(obj);  //把结果传入
			if(ret && ret.isPromise){
				ret.queue = promise.queue;
				this.promise = ret;
				return;
			}
		}
	}
};
Defered.prototype.reject = function(err){
	var promise = this.promise;
	var handler;
	while((handler = promise.queue.shift())){
		if(handler && handler.error){
			var ret = handler.error(err);
			if(ret && ret.isPromise){
				ret.queue = promise.queue;
				this.promise = ret;
				return;
			}
		}
	}
};
/**
 * 这个函数会被做为异步的回函数来使用
 * 当异步返回时,这个函数会被执行
 * 就会触发成功或失败,并把数据传递出去
 *
 */
Defered.prototype.callback = function(){
	var that = this;
	return function(err, file){
		if(err){
			return that.reject(err);
		}
		that.resolve(file);
	}
};


function Promise(){
	EventEmitter.call(this);
	this.queue = [];
	this.isPromise = true;
};

util.inherits(Promise, EventEmitter);
/**
 * 
 * r1会返回一个promise
 * r1.then().then()
 * 通过链接调用把所有的then中的回调函数都推入第一个defer对象的promise对象的queue中
 *
 *
**/
Promise.prototype.then = function(fulfiledHandler, errorHandler, progressHandler){
	var handler = {};
	if(typeof fulfiledHandler === 'function'){
		handler.fulfilled = fulfiledHandler;
	}
	if(typeof errorHandler === 'function'){
		handler.error = errorHandler;
	}
	this.queue.push(handler);
	return this;
};

module.exports = Defered;



//这里是实例的使用


var fs = require('fs');
var defer = require("./ListPormise");

var r1 = function(file, encoding){
	var d = new defer();
	fs.readFile(file, encoding, d.callback());
	return d.promise;
};

var r2 = function(file, encoding){
	var d = new defer();
	fs.readFile(file, encoding, d.callback());
	return d.promise;
};

r1('demo.txt','utf8').then(function(file1){
	return r2(file1.trim(),'utf8');
}).then(function(file2){
	console.log(file2);
}); 

  

原文地址:https://www.cnblogs.com/hemei/p/5615054.html