午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    node.js中實現(xiàn)同步操作的3種實現(xiàn)方法
    來源:易賢網(wǎng) 閱讀:1687 次 日期:2014-12-19 14:18:31
    溫馨提示:易賢網(wǎng)小編為您整理了“node.js中實現(xiàn)同步操作的3種實現(xiàn)方法”,方便廣大網(wǎng)友查閱!

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

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

    代碼如下:

    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)用方法:

    代碼如下:

    var req = null;

    var res = null;

    var callback = function(){};

    func1(req,res,callback);

    func2(req,res,callback);

    func3(req,res,callback);

    輸出內(nèi)容:

    代碼如下:

    in func3

    in func2

    in func1

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

    解決辦法一:callback

    代碼如下:

    //深層嵌套

    var req = null;

    var res = null;

    func1(req,res,function(){

    func2(req,res,function(){

    func3(req,res,function(){

    process.exit(0);

    })

    });

    });

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

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

    代碼如下:

    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)用相對比較清爽:

    代碼如下:

    Step(

    function thefunc1(){

    func1(this);

    },

    function thefunc2(finishFlag){

    console.log(finishFlag);

    func2(this);

    },

    function thefunc3(finishFlag){

    console.log(finishFlag);

    }

    );

    2.async 的 series方法,就本例而言,它的調(diào)用方法:

    代碼如下:

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

    }

    ]

    );

    更多信息請查看IT技術(shù)專欄

    更多信息請查看腳本欄目
    易賢網(wǎng)手機網(wǎng)站地址:node.js中實現(xiàn)同步操作的3種實現(xiàn)方法
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇剩?/div>

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)