文享日志

Promise/Deferred方案

JavaScript

发表于2017年11月11日23:55:26

0条评论 144次阅读

var events = require('events'); var util = require('util'); //Promise构造函数继承属性 var Promise = function(){ events.EventEmitter.call(this); } //Promise构造函数继承原型 util.inherits(Promise,events.EventEmitter); Promise.prototype.then = function(fulfillHandler,errorHandler,progressHandler){ if (typeof fulfillHandler === 'function') { this.once('success',fulfillHandler); } if (typeof errorHandler === 'function') { this.once('error',errorHandler); } if (typeof progressHandler === 'function') { this.on('progress',progressHandler); } } //Deffered负责事件发射,Promise负责事件监听 //当响应事件监听到某个需要响应的请求时,调用Deffered发射响应请求的成功或者失败,Promise监听Deffered发来的响应结果。 var Deffered = function(){ this.state = 'unfulfilled'; this.promise = new Promise(); }; Deffered.prototype.resolve = function(obj){ this.state = 'fulfilled'; this.promise.emit('success',obj); } Deffered.prototype.reject = function(err){ this.state = 'failed'; this.promise.emit('error',err); } Deffered.prototype.progress = function(data){ this.promise.emit('progress',data); } //封装逻辑

//res是响应事件 var promisify = function(res){ var deffered = new Deffered(); var result = ''; res.on('data',function(chunk){ result += chunk; deffered.progress(result); }) res.on('end',function(){ deffered.resolve(result); }) res.on('error',function(err){ deffered.reject(err); }) return deffered.promise; } //实际应用 //这里是先在promisify中定义发射,然后在then中定义监听。 promisify(res).then(function(){ //Done },function(err){ //Error },function(chunk){ //progress })

👍 1  👎 0
共有0条评论

发表新评论

提交

广告展示

腾讯云推广 阿里云推广