主要简单说明Promise/Deferred模式使用:
看了一部分网上写的文章,作为一个初学者,感觉部分博文介绍的很难理解,然后对博文进行简单的验证和了解。下面的例子真的单个异步操作应用的模式。
测试例子主要是接收 post 请求数据的基础修改。
模式的实质:使用Promise定义回调函数,使用Deferred来触发回调函数。其中使用了then,once,util等函数,请自行查阅文档。
测试代码提交post请求使用Fiddler的Composer来完成构造请求头,参照如下:
测试代码如下:
/* * promise/deferred模式测试用例 */ var events = require('events'); var util = require('util'); var http = require('http'); var Promise = function(){ events.EventEmitter.call(this); // util.inherits(this,events.EventEmitter); }; util.inherits(Promise,events.EventEmitter); Promise.prototype.then = function(fulfilledHandler,errorHandler,progressHandler){ if(typeof fulfilledHandler === 'function'){ this.once("sucess",fulfilledHandler); } if(typeof errorHandler === 'function'){ this.once("error",errorHandler); } if(typeof progressHandler === 'function'){ this.once("progress",progressHandler); } }; var Deferred = function(){ this.promise = new Promise(); this.state = 'unfulfilled'; }; Deferred.prototype.resolve = function(obj){ this.state = 'fulfilled'; this.promise.emit("success",obj); }; Deferred.prototype.reject = function(error){ this.state = 'failed'; this.promise.emit("error",error); }; Deferred.prototype.progress = function(data){ this.promise.emit("progress",data); }; //测试用例 var promisify = function(req){ var deferred = new Deferred(); var result = ''; req.on('data',function(chunk){ result += chunk; deferred.progress(chunk); }); req.on('end',function(){ deferred.resolve(result); }); req.on('error',function(err){ deferred.reject(err) ; }); return deferred.promise; }; //创建服务进行验证 var server = http.createServer(function(req, res){ promisify(req).then( function(){ console.log("success"); }, function(err){ console.log("error information : "+ err); }, function(chunk){ console.log("chunk data : "+chunk); }); }).listen(1000,"127.0.0.1");
模式使用的场合:模式基于事件处理的方法,一般情况下代码通过,callback(err,data1...)形式嵌套来解决单个异步调用,使用事件模式,简化回调函数的代码量,页面代码简洁