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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
浅谈Node的内存泄露问题
May 06 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获取网络文件的实现代码
2010/01/01 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
php使用变量动态创建类的对象用法示例
2017/02/06 PHP
详解PHP5.6.30与Apache2.4.x配置
2017/06/02 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
JavaScript中的闭包原理分析
2010/03/08 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
js自执行函数的几种不同写法的比较
2012/08/16 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
javascript实现判断鼠标的状态
2015/07/10 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
详解vue-cli + webpack 多页面实例应用
2017/04/25 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
Python button选取本地图片并显示的实例
2019/06/13 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
简述安装Slackware Linux系统的过程
2012/05/08 面试题
北大青鸟学生求职信
2013/09/24 职场文书
公司培训心得体会
2014/01/03 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
实习指导教师评语
2014/12/30 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
九年级化学教学反思
2016/02/22 职场文书