Promise/deferred模式是怎么工作的?
发布于 9 年前 作者 matthewgao 5848 次浏览 最后一次编辑是 8 年前 来自 问答

实在没看懂,明明是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里

http://matthewgao.github.io/nodejs-promise-issue/

装饰器的思路。。。是指trunk?

回到顶部