nodejs中简单实现Javascript Promise机制的实例
nodejs中简单实现Javascript Promise机制的实例
发布时间:2016-12-30 来源:查字典编辑
摘要:promise/deferred是一个很好的处理异步调用编码的规范,下面以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,即可看到运行效果。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Javascript教程学习
热门Javascript教程学习
编程开发子分类