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服务器(7):阻塞操作的实现
Dec 18 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
用NodeJS实现批量查询地理位置的经纬度接口
Aug 16 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
windows 下安装nodejs 环境变量设置
Feb 02 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
Nodejs中使用phantom将html转为pdf或图片格式的方法
Sep 18 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 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
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
php 获得汉字拼音首字母的函数
2009/08/01 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
老生常谈javascript中逻辑运算符&&和||的返回值问题
2017/04/13 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
python3利用tcp实现文件夹远程传输
2018/07/28 Python
python实现AES加密与解密
2019/03/28 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
python3正则模块re的使用方法详解
2020/02/11 Python
Python通过socketserver处理多个链接
2020/03/18 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
2021/01/27 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
Zooplus罗马尼亚:宠物食品和配件
2019/11/02 全球购物
应用英语专业自荐信
2014/01/26 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
2014年内勤工作总结
2014/11/24 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS