西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴(lài)的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開(kāi)發(fā)javascript|JQuery → 一些nodejs實(shí)現(xiàn)同步操作想法實(shí)現(xiàn)

一些nodejs實(shí)現(xiàn)同步操作想法實(shí)現(xiàn)

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2011/12/23 1:22:26字體大小:A-A+

作者:西西點(diǎn)擊:732次評(píng)論:2次標(biāo)簽: 同步

115同步盤(pán)v1.0.9.3 正式版
  • 類(lèi)型:下載工具大。1.6M語(yǔ)言:中文 評(píng)分:1.8
  • 標(biāo)簽:
立即下載

     眾所周知,異步是nodejs中得天獨(dú)厚的特點(diǎn)和優(yōu)勢(shì),但同時(shí)在程序中同步的需求(比如控制程序的執(zhí)行順序?yàn)椋篺unc1 -> func2 ->func3 )也是很常見(jiàn)的。本文就是對(duì)這個(gè)問(wèn)題記錄自己的一些想法。

     需要執(zhí)行的函數(shù):

var func1 = function(req,res,callback){
  setTimeout(function(){
    console.log('in func1');
    callback(req,res,1);  
  },13000);
}
var func2 = function(req,res,callback){ 
  setTimeout(function(){
    console.log('in func2');
    callback(req,res,2);
  },5000);
}

var func3 = function(req,res,callback){
  setTimeout(function(){
    console.log('in func3');
    callback(req,res,3);   
  },1000);
}

      可以看出在func1,func2和func3中都是用了setTimeout函數(shù),執(zhí)行的時(shí)間分別為13秒,5秒和1秒。由于nodejs異步的特性,如果使用普通的函數(shù)調(diào)用方法:

var req = null;
var res = null;
var callback = function(){};
func1(req,res,callback);
func2(req,res,callback);
func3(req,res,callback);

     輸出內(nèi)容:

in func3
in func2
in func1

     原因是因?yàn)閚odejs是異步的,func2不會(huì)等f(wàn)unc1執(zhí)行完畢后再執(zhí)行,而是立即執(zhí)行(func3也是如此)。由于func3的運(yùn)行時(shí)間最短而率先結(jié)束,func2次之,func1最后。但這明顯不是我們想要的結(jié)果。怎么辦?

     解決辦法一:callback

//深層嵌套
var req = null;
var res = null;

func1(req,res,function(){
  func2(req,res,function(){
    func3(req,res,function(){
      process.exit(0);   
    })  
  });  
});

     這種方法雖然能快速的解決,但暴露的問(wèn)題也很明顯,一是代碼維護(hù)不方面,二是代碼的深層嵌套看起來(lái)很不舒服。這種方法并不可取。

     解決方法二:遞歸調(diào)用

function executeFunc(funcs,count,sum,req,res){
  if(count == sum){
     return ; 
   }
   else{
    funcs[count](req,req,function(){
       count++;
       executeFunc(funcs,count,sum,req,res);
    });
   }  
}

//同步調(diào)用
var req = null;
var res = null;
var funcs = [func1,func2,func3];
var len = funcs.length;
executeFunc(funcs,0,len,req,res);

        先將多個(gè)函數(shù)組成一個(gè)數(shù)組。再可以利用遞歸函數(shù)的特性,使程序按照一定的順序執(zhí)行。

        解決方法三:調(diào)用類(lèi)庫(kù) 

       隨著nodejs的發(fā)展,響應(yīng)的類(lèi)庫(kù)也越來(lái)越多。Step和async 就是其中不錯(cuò)的。

       1. Step的調(diào)用相對(duì)比較清爽:

Step(
  function thefunc1(){
    func1(this);
  },
  function thefunc2(finishFlag){
    console.log(finishFlag);
    func2(this);
  },
  function thefunc3(finishFlag){
    console.log(finishFlag);
  }
);

       2.async 的 series方法,就本例而言,它的調(diào)用方法:

var req = null;
var res = null;
var callback = function(){};

async.series(
  [
    function(callback){
      func1(req,res,callback);
    },  
    function(callback){
      func2(req,res,callback);
    },
    function(callback){
      func3(req,res,callback);  
    } 
  ]
);

    網(wǎng)盤(pán)
    (268)網(wǎng)盤(pán)
    網(wǎng)盤(pán)是什么網(wǎng)盤(pán)是一個(gè)云存儲(chǔ)工具,通俗的來(lái)說(shuō)就是你把文件通過(guò)網(wǎng)盤(pán)儲(chǔ)存在網(wǎng)絡(luò)上。只要你登上網(wǎng),不論在什么地方都能使用。相當(dāng)于網(wǎng)絡(luò)移動(dòng)盤(pán)。用起來(lái)挺方便。網(wǎng)盤(pán)哪個(gè)好其實(shí)這個(gè)毋庸置疑的百度云網(wǎng)盤(pán)是最好的,目前網(wǎng)盤(pán)也就那么幾家,對(duì)用戶來(lái)說(shuō)只要免費(fèi)就行了,其他的對(duì)我們的普通用戶來(lái)說(shuō)并不是特別重要。網(wǎng)盤(pán)下載客戶端大全說(shuō)明西西軟件園提供市面上主流網(wǎng)盤(pán)的客戶端下載,除了網(wǎng)盤(pán)客戶端的各種版本之外,西西還會(huì)提供一些網(wǎng)盤(pán)相...更多>>

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(2)

    昵稱(chēng):
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)