国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 16:11:30
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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);  
    } 
  ]
);

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 渭南市| 塔城市| 阜新| 太康县| 哈尔滨市| 衡南县| 盐津县| 阳山县| 遂溪县| 济南市| 阿拉善盟| 乐亭县| 洪江市| 伊通| 调兵山市| 麟游县| 赤峰市| 松阳县| 怀集县| 隆安县| 衡南县| 长春市| 海兴县| 柏乡县| 公主岭市| 华安县| 新昌县| 万全县| 贵港市| 西盟| 于田县| 永顺县| 比如县| 杭州市| 夏河县| 鸡泽县| 新巴尔虎左旗| 玛曲县| 荔浦县| 济源市| 大安市|