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与Mysql的交互示例代码
Aug 18 NodeJs
nodejs实现的一个简单聊天室功能分享
Dec 06 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
nodejs搭建本地http服务器教程
Mar 13 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
详解HTTPS 的原理和 NodeJS 的实现
Jul 04 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
PHP 单引号与双引号的区别
2009/11/24 PHP
php通用防注入程序 推荐
2011/02/26 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
js操作select控件的几种方法
2010/06/02 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
再JavaScript的jQuery库中编写动画效果的指南
2015/08/13 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python中执行shell命令的几个方法小结
2014/09/18 Python
python3 拼接字符串的7种方法
2018/09/12 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
法国购买二手电子产品网站:Asgoodasnew
2020/03/27 全球购物
什么是类的返射机制
2016/02/06 面试题
JAVA和C++区别都有哪些
2015/03/30 面试题
竞选班干部演讲稿100字
2014/08/20 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
员工给公司的建议书
2019/06/24 职场文书
《文化苦旅》读后感:阅读,让人诗意地栖居在大地上
2019/12/24 职场文书
我的收音机情缘
2022/04/05 无线电