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

    主要简单说明Promise/Deferred模式使用:

    看了一部分网上写的文章,作为一个初学者,感觉部分博文介绍的很难理解,然后对博文进行简单的验证和了解。下面的例子真的单个异步操作应用的模式。

    测试例子主要是接收 post 请求数据的基础修改。

    模式的实质:使用Promise定义回调函数,使用Deferred来触发回调函数。其中使用了then,once,util等函数,请自行查阅文档。

    测试代码提交post请求使用Fiddler的Composer来完成构造请求头,参照如下:

node.js 异步编程解决方法 了解一_第1张图片

    测试代码如下:

/*
 * 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...)形式嵌套来解决单个异步调用,使用事件模式,简化回调函数的代码量,页面代码简洁


你可能感兴趣的:(Promise,node.js,then,deferred,once)