zoukankan      html  css  js  c++  java
  • 我对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);
    }); 
    

      

  • 相关阅读:
    联想yoga pro 13 使用Hyper-v蓝屏错误PAGE_FAULT_IN_NONPAGED-AREA的解决办法
    部署 Halo 博客系统
    GiuHub高级搜索关键字
    layer提示框弹出异常抖动,而且不显示
    bootstrap同一页面上多个模态框
    border-radius
    git查看本机ssh公钥
    简单的git连接远程仓库小记
    hexo搭建完成后输入hexo s 没有生成Html静态文件
    application/xml and text/xml的区别
  • 原文地址:https://www.cnblogs.com/hemei/p/5615054.html
Copyright © 2011-2022 走看看