nodejs中简单实现Javascript Promise机制的实例

 更新时间:2014年12月06日 12:10:18   投稿:junjie  
这篇文章主要介绍了nodejs中简单实现Javascript Promise机制的实例,本文在nodejs中简单实现一个promise/A 规范,需要的朋友可以参考下

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,即可看到运行效果。

相关文章

  • 使用node搭建自动发图文微博机器人的方法

    使用node搭建自动发图文微博机器人的方法

    这篇文章主要介绍了使用node搭建自动发图文微博机器人的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Node.js编写CLI的实例详解

    Node.js编写CLI的实例详解

    Node.js的应用场景有前后端分离、海量web页面渲染服务、命令行工具和桌面端应用等等。本篇文章选取CLI(Command Line Tools)子领域,来谈谈Node.js编写CLI的实践,让CLI切实解决实际工程问题。
    2017-05-05
  • Node.js文本文件BOM头的去除方法

    Node.js文本文件BOM头的去除方法

    这篇文章主要给大家介绍了关于Node.js文本文件BOM头的去除方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 使用node.js 获取客户端信息代码分享

    使用node.js 获取客户端信息代码分享

    本文给大家分享一段使用node.js 获取客户端信息的代码,非常的简洁,推荐给大家。
    2014-11-11
  • Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)

    Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)

    在 Node.JS 中进行端口扫描还是比较方便的,一般会有广播和轮询两种方式。下文重点给大家介绍node.js 扫描端口并发现局域网内的web服务器地址的方法,一起看看吧
    2017-09-09
  • 简单谈谈node.js 版本控制 nvm和 n

    简单谈谈node.js 版本控制 nvm和 n

    大量开发者的贡献使Node版本的迭代速度很快,版本很多(横跨0.6到0.11),所以升级Node版本就成为了一个问题。目前有n和nvm这两个工具可以对Node进行无痛升级,本文简单介绍一下二者的使用。
    2015-10-10
  • 详解Puppeteer 入门教程

    详解Puppeteer 入门教程

    本篇文章主要介绍了详解Puppeteer 入门教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Node.js中参数传递的两种方式详解

    Node.js中参数传递的两种方式详解

    这篇文章主要为大家介绍了Node.js中参数传递的两种方式:GET方式和POST方式,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Node.js dgram模块实现UDP通信示例代码

    Node.js dgram模块实现UDP通信示例代码

    这篇文章主要介绍了Node.js dgram模块实现UDP通信示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • NPM全局安装与本地安装的区别详析

    NPM全局安装与本地安装的区别详析

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,下面这篇文章主要给大家介绍了关于NPM全局安装与本地安装区别的相关资料,需要的朋友可以参考下
    2022-10-10

最新评论