萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> node.js中實現同步操作的3種實現方法

node.js中實現同步操作的3種實現方法

   眾所周知,異步是得天獨厚的特點和優勢,但同時在程序中同步的需求(比如控制程序的執行順序為:func1 -> func2 ->func3 )也是很常見的。本文就是對這個問題記錄自己的一些想法。

  需要執行的函數:

  代碼如下:

  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函數,執行的時間分別為13秒,5秒和1秒。由於nodejs異步的特性,如果使用普通的函數調用方法:

  代碼如下:

  var req = null;

  var res = null;

  var callback = function(){};

  func1(req,res,callback);

  func2(req,res,callback);

  func3(req,res,callback);

  輸出內容:

  代碼如下:

  in func3

  in func2

  in func1

  原因是因為nodejs是異步的,func2不會等func1執行完畢後再執行,而是立即執行(func3也是如此)。由於func3的運行時間最短而率先結束,func2次之,func1最後。但這明顯不是我們想要的結果。怎麼辦?

  解決辦法一:callback

  代碼如下:

  //深層嵌套

  var req = null;

  var res = null;

  func1(req,res,function(){

  func2(req,res,function(){

  func3(req,res,function(){

  process.exit(0);

  })

  });

  });

  這種方法雖然能快速的解決,但暴露的問題也很明顯,一是代碼維護不方面,二是代碼的深層嵌套看起來很不舒服。這種方法並不可取。

  解決方法二:遞歸調用

  代碼如下:

  function executeFunc(funcs,count,sum,req,res){

  if(count == sum){

  return ;

  }

  else{

  funcs[count](req,req,function(){

  count++;

  executeFunc(funcs,count,sum,req,res);

  });

  }

  }

  //同步調用

  var req = null;

  var res = null;

  var funcs = [func1,func2,func3];

  var len = funcs.length;

  executeFunc(funcs,0,len,req,res);

  先將多個函數組成一個數組。再可以利用遞歸函數的特性,使程序按照一定的順序執行。

  解決方法三:調用類庫

  隨著nodejs的發展,響應的類庫也越來越多。Step和async 就是其中不錯的。

  1.Step的調用相對比較清爽:

  代碼如下:

  Step(

  function thefunc1(){

  func1(this);

  },

  function thefunc2(finishFlag){

  console.log(finishFlag);

  func2(this);

  },

  function thefunc3(finishFlag){

  console.log(finishFlag);

  }

  );

  2.async 的 series方法,就本例而言,它的調用方法:

  代碼如下:

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

  }

  ]

  );

copyright © 萬盛學電腦網 all rights reserved