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学习笔记之网络编程
Aug 03 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 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翻页类
2009/06/01 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
图片动画横条广告带上下滚动可自定义图片、链接等等
2013/10/20 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
一分钟理解js闭包
2016/05/04 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
Vue组件开发初探
2017/02/14 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
python版简单工厂模式
2017/10/16 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
PyQt5每天必学之组合框
2018/04/20 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
Python devel安装失败问题解决方案
2020/06/09 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
十佳美德少年事迹材料
2014/02/05 职场文书
毕业生自荐信格式
2014/03/07 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
党员一帮一活动总结
2014/07/08 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
医院领导班子整改方案
2014/10/01 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书