最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

node.js中實現(xiàn)同步操作的3種實現(xiàn)方法

 更新時間:2014年12月05日 13:12:14   投稿:junjie  
這篇文章主要介紹了node.js中實現(xiàn)同步操作的3種實現(xiàn)方法,本文用實例講解一些需要同步操作的情況下,如何編程實現(xiàn),需要的朋友可以參考下

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

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

復(fù)制代碼 代碼如下:

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í)行的時間分別為13秒,5秒和1秒。由于nodejs異步的特性,如果使用普通的函數(shù)調(diào)用方法:

復(fù)制代碼 代碼如下:

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

輸出內(nèi)容:

復(fù)制代碼 代碼如下:

in func3
in func2
in func1

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

解決辦法一:callback

復(fù)制代碼 代碼如下:

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

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

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

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

復(fù)制代碼 代碼如下:

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

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

解決方法三:調(diào)用類庫

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

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

復(fù)制代碼 代碼如下:

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

2.async 的 series方法,就本例而言,它的調(diào)用方法:
復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • NodeJS學(xué)習(xí)筆記之MongoDB模塊

    NodeJS學(xué)習(xí)筆記之MongoDB模塊

    nodejs是個強大的平臺,有基本功能,而且可以掛很多模塊。我們現(xiàn)在需要和mongodb連接的驅(qū)動,就類似比如mysql的java驅(qū)動一樣。nodejs有好幾個mongodb的第三方驅(qū)動。和jdbc不一樣,沒有標(biāo)準。所以需要到驅(qū)動的網(wǎng)站上去了解學(xué)習(xí)怎么使用它訪問mongodb。
    2015-01-01
  • Node.js中sequelize時區(qū)的配置方法

    Node.js中sequelize時區(qū)的配置方法

    這篇文章主要給大家介紹了關(guān)于Node.js中sequelize時區(qū)的配置方法,文中先對時區(qū)的基礎(chǔ)概念進行了簡單介紹,然后通過示例代碼詳細介紹了sequelize時區(qū)的配置方法,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • koa2 從入門到精通(小結(jié))

    koa2 從入門到精通(小結(jié))

    這篇文章主要介紹了koa2 從入門到精通,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • node實現(xiàn)mock-plugin中間件的方法

    node實現(xiàn)mock-plugin中間件的方法

    這篇文章主要介紹了node實現(xiàn)mock-plugin中間件的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • nodejs入門教程三:調(diào)用內(nèi)部和外部方法示例

    nodejs入門教程三:調(diào)用內(nèi)部和外部方法示例

    這篇文章主要介紹了nodejs入門教程之調(diào)用內(nèi)部和外部方法,結(jié)合實例形式分析了nodejs內(nèi)部與外部方法的定義與調(diào)用相關(guān)操作實現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04
  • 深入理解Nodejs Global 模塊

    深入理解Nodejs Global 模塊

    本篇文章主要介紹了深入理解Nodejs Global 模塊,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • export?default?和?export?的使用方式示例詳解

    export?default?和?export?的使用方式示例詳解

    這篇文章主要介紹了export?default?和?export?的使用方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • node.js基于dgram數(shù)據(jù)報模塊創(chuàng)建UDP服務(wù)器和客戶端操作示例

    node.js基于dgram數(shù)據(jù)報模塊創(chuàng)建UDP服務(wù)器和客戶端操作示例

    這篇文章主要介紹了node.js基于dgram數(shù)據(jù)報模塊創(chuàng)建UDP服務(wù)器和客戶端操作,結(jié)合實例形式分析了node.js使用dgram數(shù)據(jù)報模塊創(chuàng)建UDP服務(wù)器和客戶端,以及進行UDP廣播、組播相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • nodejs 終端打印進度條實例代碼

    nodejs 終端打印進度條實例代碼

    本篇文章主要介紹了nodejs 終端打印進度條實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Nodejs的express使用教程

    Nodejs的express使用教程

    Express 是一個簡潔、靈活的 node.js Web 應(yīng)用開發(fā)框架, 它提供一系列強大的特性,幫助你創(chuàng)建各種 Web 和移動設(shè)備應(yīng)用,本篇文章給大家介紹nodejs的express使用教程,感興趣的朋友參考下
    2015-11-11

最新評論

临邑县| 辽阳县| 上饶县| 军事| 贵定县| 龙南县| 赣榆县| 疏附县| 文登市| 房产| 广河县| 邳州市| 左贡县| 温宿县| 宾川县| 文成县| 从江县| 洱源县| 山阴县| 朝阳区| 会东县| 三亚市| 鹿泉市| 哈尔滨市| 申扎县| 萨迦县| 阿图什市| 绥棱县| 武安市| 新干县| 平湖市| 卢龙县| 勐海县| 贺州市| 宜黄县| 邯郸县| 扎囊县| 齐齐哈尔市| 桐乡市| 册亨县| 双流县|