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搭建本地http服务器教程
Mar 13 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
NodeJs模拟登陆正方教务
Apr 28 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
nodejs实现用户登录路由功能
May 22 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
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
php禁止浏览器使用缓存页面的方法
2014/11/07 PHP
PHP模块memcached使用指南
2014/12/08 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
JavaScript Accessor实现说明
2010/12/06 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
学习Node.js模块机制
2016/10/17 Javascript
Node.js Sequelize如何实现数据库的读写分离
2016/10/23 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
利用JS hash制作单页Web应用的方法详解
2017/10/10 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
axios封装与传参示例详解
2020/10/18 Javascript
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
python实现扫雷游戏
2020/03/03 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
简历自荐信
2013/12/02 职场文书
难忘的一天教学反思
2014/04/30 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis