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


Posted in NodeJs onDecember 06, 2014

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,即可看到运行效果。

NodeJs 相关文章推荐
nodejs win7下安装方法
May 24 NodeJs
用nodejs实现PHP的print_r函数代码
Mar 14 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 #NodeJs
详谈nodejs异步编程
Dec 04 #NodeJs
nodejs下打包模块archiver详解
Dec 03 #NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 #NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 #NodeJs
nodejs教程之环境安装及运行
Nov 21 #NodeJs
nodejs教程之异步I/O
Nov 21 #NodeJs
You might like
PHP源码之explode使用说明
2011/08/05 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
javascript中"/"运算符常见错误
2010/10/13 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
[04:29]【TI9采访】OG.N0tail在胜者组决赛后接受采访
2019/08/25 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
Python读取键盘输入的2种方法
2015/06/16 Python
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Numpy掩码式数组详解
2018/04/17 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
详解python中docx库的安装过程
2019/11/08 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
如何打造一封优秀的留学推荐信
2014/01/25 职场文书
中学生差生评语
2014/01/30 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
甜品店创业计划书
2014/08/14 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
使用canvas实现雪花飘动效果的示例代码
2021/03/30 HTML / CSS