跳到主要内容

node.js 下 promise 开源包 q 使用

· 阅读需 2 分钟
一介布衣
全栈开发者 / 技术写作者
  • 文章目录
  • async 如何来实现

  • promise 如何实现

  • 安装

  • 引用

  • 给方法定义一个 promise 规范

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

  • Q 并行执行几个方法

  • 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);
});