Promise机制的深入研究

上一篇文章只是简单的对promise原理有个简单的实现,这次增加了

  • all方法,同时调用多次异步请求
  • resolvereject方法进行了重构,增加了对多个异步调用的处理
  • promse进行了改造,除掉了事件触发机制,增加了异步队列


详细代码如下:

/**
 * Created with JetBrains WebStorm.
 * User: xuwenmin
 * Date: 14-4-26
 * Time: 下午1:01
 * 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(){
    this.queue = [];
    this.isPromise = true;
}
// then 方法为promise/A 规范中的方法
Promise.prototype.then = function(successHandler, errorHandler, progressHandler){
    var hanlder = {};
    if (typeof successHandler == 'function'){
        hanlder.fulfilled =  successHandler;
    }
    if (typeof errorHandler === 'function'){
        hanlder.error =  errorHandler;
    }
    this.queue.push(hanlder);
    return this;
}

// 定义延迟对象
// 包含一个状态和一个promise对象
var Deferred = function(){
    this.promise = new Promise();
}
// 同时处理多个异步的情况
Deferred.prototype.all = function(promises){
    var count = promises.length;
    var that = this;
    var results = [];
    promises.forEach(function(promise, i){
        promise.then(function(data){
            count--;
            results[i] = data;
            // 如果执行玩了,则调用完成方法
            if(count == 0){
                that.resolve(results);
            }
        }, function(err){
            that.reject(err);
        });
    });
    return this.promise;
}
// 生成回调函数
Deferred.prototype.callback = function(){
    var that = this;
    return function(err, data){
        if(err){
            that.reject(err);
        }else{
            that.resolve(data);
        }
    };
}
Deferred.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;
              }
          }
      }
}
Deferred.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;
               }
           }
       }
}

var client1 = 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;
        });
        res.on('end', function(){
            deferred.resolve(data);
        });

    });
    req.on('error', function(err){
        deferred.reject(err);
    })
    req.end();
    return deferred.promise;
}
var client2 = function(predata){
    var options = {
        hostname:'www.hao123.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;
        });
        res.on('end', function(){
            data += predata;
            deferred.resolve(data);
        });
    });
    req.on('error', function(err){
        deferred.reject(err);
    })
    req.end();
    return deferred.promise;
}
//
client1().then(function(msg){
    return client2(msg);
}).then(function(data){
    console.log('\033[96m 两次请求的总数据:\033[39m',data);
});

总结

上面的代码参考了深入浅出NodeJS,权当心得体会.

时间: 2024-09-19 09:06:01

Promise机制的深入研究的相关文章

闲话Promise机制

Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js带来强大灵活性的同时,也带来了嵌套回调的问题.详细来说主要有两点,第一嵌套太深代码可读性太差,第二并行逻辑必须串行执行. request = function(url, cb, eb) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange

如何理解 JavaScript 中的 Promise 机制

本文讲的是如何理解 JavaScript 中的 Promise 机制, Promise 的世界 原生 Promises 是在 ES2015 对 JavaScript 做出最大的改变.它的出现消除了采用 callback 机制的很多潜在问题,并允许我们采用近乎同步的逻辑去写异步代码. 可以说 promises 和 generators ,代表了异步编程的新标准.不论你是否用它,你都得 必须 明白它们究竟是什么. Promise 提供了相当简单的 API ,但也增加了一点学习曲线.如果你以前从没见过

[React Native]Promise机制

React Native中经常会看到Promise机制. Promise机制代表着在JavaScript程序中下一个伟大的范式.可以把一些复杂的代码轻松撸成一个串,和Android中的rxjava非常像. Promise代表一个任务结果,这个任务有可能完成,有可能没有完成.Promise模式唯一需要的一个接口是调用then方法,用来注册当Promise完成或者失败时调用的回调函数. 一般异步函数用到了Promise机制. 在异步操作之前通常异步操作是借助回调函数的. onScuccessCall

基于云的跨组织信息系统信任机制的实证研究

基于云的跨组织信息系统信任机制的实证研究 朱江 童德蓉 赖嘉伟 提出了基于云的跨组织信息系统(CIOS)的信任产生和作用机制模型,并利用来自中国内地的256份有效样本数据对该模型进行了实证检验.结果表明信任于用户对CIOS的使用态度和意向有着重要的影响,而可靠性.可用性.可控性和互操作性是CIOS能否被信任的关键因素.基于研究发现对CIOS的研发与应用给出了若干建议. 基于云的跨组织信息系统信任机制的实证研究

Android中的动态加载机制的学习研究_Android

在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定

Android中的动态加载机制的学习研究

在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本文对网上Android动态加载jar的资料进行梳理和实践在这里与大家一起分享,试图改善频繁升级这一弊病. Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求.但是有些特殊问题,常常引发我们进一步的沉思.我们从沉思中产生顿悟,从而产生新的技术形式. 如何开发一个可以自定

Java中异常机制的深入研究

由于本文旨在探讨Java"异常机制"的深层原理,因此关于"异常"的使用方法都不做详细说明.首先看一段非常熟悉的用于打开一个文件的C程序段: FILE *fp;fp=fopen(filename,"rw");if(fp==NULL){ printf("cannot open file\n"); exit(0);} 在这段程序中,if条件语句中的一段用来处理没有找到指定文件,或者其它原因无法正确打开指定文件.可是如果遇到一个责任心

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 = requir

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

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 Even