Promise/deferred模式是怎么工作的?
实在没看懂,明明是emit发生在on之前,为什么还能正常处理回调函数?
6 回复
@i5ting 我看了这个,这个用了一个python装饰器的思路,但是另外我还看到了一个不一样的实现:
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.then1 = 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){
debugger;
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;
}
var c = client();
c.then1(function(data){
console.log('请求完成', data);
}, function(err){
console.log('访问错误', err);
}, function(chunk){
console.log('正在读取', chunk);
});
~~~
这个很困扰我,我实在是看不到哪里保存了状态和数据
@matthewgao 我有点晕,你是不懂promise还是不会nodejs调试啊?
另外 @matthewgao 格式化一下markdown
@i5ting 是这个样,我最近在读 一本叫 深入浅出Node.js的书 里面关于promise/defer 他给出了个例子,我觉得那个例子是有问题的,我作为一个初学者,想求证下
我把我的试验写在了我的Blog里
装饰器的思路。。。是指trunk?