首頁  >  文章  >  web前端  >  node.js中實作同步操作的3種實作方法_node.js

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

WBOY
WBOY原創
2016-05-16 16:29:011492瀏覽

眾所周知,非同步是得天獨厚的特點和優勢,但同時在程式中同步的需求(例如控製程式的執行順序為: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); 
    }
  ]
);

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn