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应用主文件index.js
Aug 28 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
nodejs搭建本地服务器轻松解决跨域问题
Mar 21 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
Nodejs处理异常操作示例
Dec 25 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
nodejs中各种加密算法的实现详解
Jul 11 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 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 5.0对象模型深度探索之绑定
2006/09/05 PHP
PHP模板引擎SMARTY
2006/10/09 PHP
php中数字0和空值的区别分析
2014/06/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
php实现无限级分类
2014/12/24 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
自定义jQuery选项卡插件实例
2013/03/27 Javascript
IE网页js语法错误2行字符1、FF中正常的解决方法
2013/09/09 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
js验证上传图片的方法
2015/05/12 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
python爬虫之遍历单个域名
2019/11/20 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
python 消除 futureWarning问题的解决
2019/12/25 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
Ruby如何进行文件操作
2014/07/17 面试题
《美丽的彩虹》教学反思
2014/02/25 职场文书
企业精神口号
2014/06/11 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
安全守法证明
2015/06/23 职场文书