您的位置:首页 > Web前端 > Node.js

node.js 异步编程解决方法 了解一

2015-05-24 15:25 495 查看
    主要简单说明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...)形式嵌套来解决单个异步调用,使用事件模式,简化回调函数的代码量,页面代码简洁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息