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 url验证(url-valid)的使用方法
Nov 18 NodeJs
nodejs npm package.json中文文档
Sep 04 NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
nodejs基于express实现文件上传的方法
Mar 19 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
nodejs dgram模块广播+组播的实现示例
Nov 04 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
分享五个Node.js开发的优秀实践 
Apr 07 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常用技巧总结(附函数代码)
2012/02/04 PHP
php不用正则验证真假身份证
2013/11/06 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP getNamespaces()函数讲解
2019/02/03 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
通过隐藏option实现select的联动效果
2009/11/10 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
js实现自定义进度条效果
2017/03/15 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
[06:16]《DAC最前线》之地区预选赛全面回顾
2015/01/19 DOTA
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
Python编程实现正则删除命令功能
2017/08/30 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
python try 异常处理(史上最全)
2019/03/07 Python
详解python中init方法和随机数方法
2019/03/13 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
新奥尔良珠宝:Mignon Faget
2020/11/23 全球购物
会计实习生工作总结的自我评价
2013/10/07 职场文书
跟单文员的岗位职责
2013/11/14 职场文书
机关节能减排实施方案
2014/03/17 职场文书
C++程序员求职信
2014/05/07 职场文书
本溪关门山导游词
2015/02/09 职场文书
新闻稿格式范文
2015/07/18 职场文书
如何在Python中创建二叉树
2021/03/30 Python
Django基础CBV装饰器和中间件
2022/03/22 Python