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教程之环境安装及运行
Nov 21 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 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/05/26 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
js 与或运算符 || && 妙用
2009/12/09 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
原生js仿jq判断当前浏览器是否为ie,精确到ie6~8
2014/08/30 Javascript
JavaScript控制网页平滑滚动到指定元素位置的方法
2015/04/17 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
三种方式实现瀑布流布局
2017/02/10 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
web.py在模板中输出美元符号的方法
2014/08/26 Python
python之PyMongo使用总结
2017/05/26 Python
对Python3中的input函数详解
2018/04/22 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
Django框架之登录后自定义跳转页面的实现方法
2019/07/18 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
The North Face北面英国官网:美国著名户外品牌
2017/12/13 全球购物
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
关于读书的演讲稿400字
2014/08/27 职场文书
高三英语复习计划
2015/01/19 职场文书
现场施工员岗位职责
2015/04/11 职场文书