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修复ipa处理过的png图片
Feb 17 NodeJs
nodejs 终端打印进度条实例代码
Apr 22 NodeJs
NodeJs模拟登陆正方教务
Apr 28 NodeJs
详解nodejs实现本地上传图片并预览功能(express4.0+)
Jun 28 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 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中error_reporting函数用法详细介绍
2017/06/11 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
JS中将多个逗号替换为一个逗号的实现代码
2017/06/23 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
JavaScript 性能提升之路(推荐)
2019/04/10 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Python实现队列的方法
2015/05/26 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
python3爬虫怎样构建请求header
2018/12/23 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Python读取xlsx文件的实现方法
2019/07/04 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
python标记语句块使用方法总结
2019/08/05 Python
Python接口测试环境搭建过程详解
2020/06/29 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
python中append函数用法讲解
2020/12/11 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
大学生实习自我鉴定
2013/12/11 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
最新创业融资计划书
2014/01/19 职场文书
春节随笔
2015/08/15 职场文书