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中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 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批量删除、清除UTF-8文件BOM头的代码实例
2014/04/14 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
PHP利用header跳转失效的解决方法
2014/10/24 PHP
php上传中文文件名乱码问题处理方案
2015/02/03 PHP
PHP判断IP并转跳到相应城市分站的方法
2015/03/25 PHP
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
2014/05/08 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
JavaScript使用push方法添加一个元素到数组末尾用法实例
2015/04/06 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
python使用百度翻译进行中翻英示例
2014/04/14 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
Stella McCartney官网:成衣、包袋、香水、内衣、童装及Adidas系列
2018/12/20 全球购物
四年大学生活的个人自我评价
2013/12/11 职场文书
出国留学担保书
2014/05/20 职场文书
食品安全宣传标语
2014/06/07 职场文书
授权委托书
2014/07/31 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
《窃读记》教学反思
2016/02/18 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
MySQL时区造成时差问题
2022/04/13 MySQL