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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
详解nodejs异步I/O和事件循环
Jun 07 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 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
模仿OSO的论坛(一)
2006/10/09 PHP
php获取汉字首字母的函数
2013/11/07 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
PHP单态模式简单用法示例
2016/11/16 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
javascript事件模型介绍
2016/05/31 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
Vue 实时监听窗口变化 windowresize的两种方法
2018/11/06 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python变量和字符串详解
2017/04/29 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
文体活动实施方案
2014/03/27 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
班委竞选演讲稿
2014/04/28 职场文书
中学社团活动总结
2015/05/07 职场文书
家装电话营销开场白
2015/05/29 职场文书
医院病假条怎么写
2015/08/17 职场文书
导游词之任弼时故居
2020/01/07 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
OpenCV 图像梯度的实现方法
2021/07/25 Python
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python
讲解Python实例练习逆序输出字符串
2022/05/06 Python