node.js 下 promise 开源包 q 使用

promise.jpg

promise 规范 可以让你从繁杂的 callback 中解脱出来.

如果我们在传统的 callback 中执行 5个 步骤,应该是下面这样的:


setp1(function(res)){
   setp2(function(res)){
       setp3(function(res){
           setp4(function(res){
               setp5(function(res){
                   //终于执行完了
               });
           });
       });
   });
});

如何摆脱上面的 callback 噩梦

async 如何来实现

async.series({
   oneClass:function(done){
       class.getStudent('1班',function(error,oneResult){
           if(!error)
               done(null,oneResult);
           else
               done(error,null);
       });
   },
   twoClass:function(done){
       class.getStudent('2班',function(error,twoResult){
           if(!error)
               done(null,twoResult);
           else
               done(error,null);
       }
   },
   threeClass:function(done){
       class.getStudent('3班',function(error,threeResult){
           if(!error)
               done(null,threeResult);
           else
               done(error,null);
       }
   }
},function(error,result){
   if(!error)
       callback(null,result);
   else
       callback(error,null);
});

promise 如何实现

今天我们要介绍的是实现了 promise 规范A 的 q 开源包.

github地址: https://github.com/kriskowal/q

npm 地址: https://www.npmjs.org/package/q

安装

npm install q --save

引用

var Q=require('q');

给方法定义一个 promise 规范


var getFile = function(file){
   var defer = Q.defer();
   fs.readFile(file, "utf8",function(err,data){            
       if(!err){
           defer.resolve(data);//成功就返回数据
       }else{
           defer.reject(err);//失败就返回错误
       }           
   });
   return defer.promise;//必须返回promise
}

调用上面实现了 promise 规范的方法

getFile("../test.txt").then(function (data) { 
    //then方法两个匿名函数作为参数,第一个成功时执行,第二个失败时执行,
    console.log(data);
}, function (error) {      
    console.error(error);
});

Q 并行执行几个方法

Q.all([//执行多个函数
    setp1(),
    setp2(),
    setp3()
])
.spread(function (rtn1,rtn2,rtn3) {
    //对应的多个返回值
    console.log(rtn1,rtn2,rtn3);
    return rtn1+rtn2+rtn3;
})
.done(function(result){
    console.log(result);
});

出自:node.js 下 promise 开源包 q 使用



回到顶部