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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM