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实现遍历文件夹并统计文件大小
May 28 NodeJs
基于nodejs+express(4.x+)实现文件上传功能
Nov 23 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 NodeJs
nodejs入门教程六:express模块用法示例
Apr 24 NodeJs
配置nodejs环境的方法
May 13 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
NodeJs form-data格式传输文件的方法
Dec 13 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 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中的extract的作用分析
2008/04/09 PHP
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
js的.innerHTML = ""IE9下显示有错误的解决方法
2013/09/16 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
Vue.js更改调试地址端口号的实例
2018/09/19 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
小程序实现投票进度条
2019/11/20 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
一个基于flask的web应用诞生(1)
2017/04/11 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
python爬取招聘要求等信息实例
2020/11/20 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
空字符串(“”)和null的区别
2012/11/13 面试题
当当网软件测试笔试题
2015/11/24 面试题
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
企业出纳岗位职责
2014/03/12 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
高中教师个人工作总结
2015/02/10 职场文书
第一节英语课开场白
2015/06/01 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL