q.js实现nodejs顺序调用

nodejs的异步调用有时候是最让人头疼的,如何能是一些代码顺序的执行呢,这里和大家分享nodejs的promise

什么是promise

promise一个标准,它描述了异步调用的返回结果,包括正确返回结果和错误处理。关于详细的说明文档可以参考Promises/A+。目前实现promise标准的模块有很多,如Q、bluebird和Deferred,下面我们以Q为例,介绍一下promisenodejs中的使用方法。

我查找了关于promise的使用,其中最好用的就是q.js了,个人觉得。当然还有promise.js,有兴趣的朋友可以研究一下,这里主要说一下q.js的用法。

首先下载安装q.js——

npm install q

1、使用Q.nfcall

相对于Q.fcall ,Q.nfcall 就是node 的Q.fcall。

var FS = require('fs'),
    Q   = require('q'),
    colors = require('colors'),
    file = 'example.txt';
var fsReadFile = Q.nfcall(FS.readFile,file,encoding);

fsReadFile.then(function(result){

console.log((“invoke in nfcall ” + file).red);

console.log(result.green);

},function(error){

console.log(“invoke in nfcall”.red);

console.log(error.toString().red);

}

);

Q.fcall(function () {

return "1";

})

.then(function(value2){

console.log("打印", value2);

return User.test(value2);

})

.then(function (value3) {

console.log(value3);

return "3";

})

.then(function (value4) {

console.log(value4);

return "4";

})

.then(function (value4) {

// Do something with value4

console.log("显示:", value4);

})

.catch(function (error) {

// Handle any error from all above steps

})

.done();

2使用Q.denodeify

var fsReadFile_denodeify = Q.denodeify(FS.readFile);
fsReadFile_denodeify(file,encoding).then(function(result){
  console.log("invoke in denodeify".red);
  console.log(result.green)
},function(error){
  console.log("invoke in denodeify".red);
  console.log(error.toString().red);
}
);

3、使用Q.deferd

var fsReadFile_deferd = function(file,encoding){
var deferred = Q.defer();
  FS.readFile(file,encoding,function(error,result){
if(error){
    deferred.reject(error.toString().red);
  }
  deferred.resolve(result);
});
return deferred.promise;
};
fsReadFile_deferd(file).then(function(result){
  console.log("invoke in deferd".red);
  console.log(result.toString().green);
},function(error){
  console.log("invoke in deferd".red);
  console.log(error.toString().red);
}
);

4、使用makeNodeResolver()

var fsReadFile_makeNodeResolver = function(file,encoding){
var deferred = Q.defer();
  FS.readFile(file,encoding,deferred.makeNodeResolver());
return deferred.promise;
};
fsReadFile_makeNodeResolver(file,encoding).then(function(result){
  console.log("invoke in makeNodeResolver".red);
  console.log(result.green);
},function(error){
  console.log(error.toString().red);
});