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读取JSON文件格式化时的注意事项
Sep 25 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
3分钟快速搭建nodejs本地服务器方法运行测试html/js
Apr 01 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 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之Smarty入门
2007/01/04 PHP
php项目打包方法
2008/02/18 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
jQuery入门知识简介
2010/03/04 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
js获取本机的外网/广域网ip地址完整源码
2013/08/12 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
js实现的牛顿摆效果
2015/03/31 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
关于vue-router的那些事儿
2018/05/23 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
wxPython框架类和面板类的使用实例
2014/09/28 Python
Python迭代器和生成器介绍
2015/03/06 Python
python如何实现内容写在图片上
2018/03/23 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
wxPython:python首选的GUI库实例分享
2019/10/05 Python
python 初始化一个定长的数组实例
2019/12/02 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
在HTML5中使用MathML数学公式的简单讲解
2016/02/19 HTML / CSS
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
施工班组长岗位职责
2014/01/05 职场文书
三查三看党性分析材料
2014/02/18 职场文书
师德先进个人材料
2014/12/20 职场文书
优化经济发展环境工作总结
2015/08/11 职场文书
SQLServer之常用函数总结详解
2021/08/30 SQL Server
asyncio异步编程之Task对象详解
2022/03/13 Python
Python中time与datetime模块使用方法详解
2022/03/31 Python