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服务器(10):处理POST请求
Dec 18 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 NodeJs
浅谈vue websocket 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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
表单填写时用回车代替TAB的实现方法
2007/10/09 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
js实现图片轮播效果学习笔记
2017/07/26 Javascript
Angular2环境搭建具体操作步骤(推荐)
2017/08/04 Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
2017/08/09 jQuery
JS中Map和ForEach的区别
2018/02/05 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
Python中__new__与__init__方法的区别详解
2015/05/04 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
Python统计单词出现的次数
2018/04/04 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
用Python解数独的方法示例
2019/10/24 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
JACK & JONES瑞典官方网站:杰克琼斯欧式风格男装
2017/12/23 全球购物
结婚典礼证婚词
2014/01/11 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
银行稽核岗位职责
2015/04/13 职场文书
寻找成龙观后感
2015/06/12 职场文书
如何撰写促销方案?
2019/07/05 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android