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

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

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

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

需要執(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í)行的時(shí)間分別為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

原因是因?yàn)閚odejs是異步的,func2不會(huì)等f(wàn)unc1執(zhí)行完畢后再執(zhí)行,而是立即執(zhí)行(func3也是如此)。由于func3的運(yùn)行時(shí)間最短而率先結(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);  
    }) 
  }); 
});

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

解決方法二:遞歸調(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);

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

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

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

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

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

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

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

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

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

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

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

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

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

    深入理解Nodejs Global 模塊

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

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

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

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

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

    nodejs 終端打印進(jìn)度條實(shí)例代碼

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

    Nodejs的express使用教程

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

最新評(píng)論

邳州市| 青海省| 晋江市| 德令哈市| 桃园市| 沁水县| 阳谷县| 民乐县| 井陉县| 勃利县| 高碑店市| 齐齐哈尔市| 高陵县| 梨树县| 顺平县| 山东| 奎屯市| 滦平县| 习水县| 尉氏县| 方城县| 齐河县| 赤壁市| 临西县| 平凉市| 房山区| 淮南市| 砚山县| 布尔津县| 丁青县| 静乐县| 云霄县| 刚察县| 临海市| 丹巴县| 辽阳县| 民和| 蒲江县| 广河县| 库伦旗| 苏尼特左旗|