node.js實(shí)用代碼段(二)

1.nodejs 異步操作小test

setTimeout(function(){

console.log('asyn- print it now!');

},3000);

console.log('asyn - print it 3 second letter');

setTimeOut()可以設(shè)定延遲

2.在異步操作下使用 try catch語句

錯(cuò)誤的做法:

try{

setTimeout(function(){

var data = a/0;

},1000);

}catch(e){

console.log(e);

}

console.info();

正確的做法:

try{

setTimeout(function(){

var data = a/0;

},1000);

}catch(e){

console.log(e);

}

console.info();

3.Async的串行流程

先要install async庫

var async = require('async');

async.series([

function(callback){

callback(null,'hello');

},

function(callback){

callback(null,'async');

},

function(callback){

callback(null,'series');

}

],function(err,results){

console.log(results);

});

console.info();

async.series()函數(shù)參數(shù)是兩個(gè) 第一個(gè)是一個(gè)函數(shù)數(shù)組 (也可以傳入一個(gè)JSON對(duì)象)纵柿,第二個(gè)參數(shù)是一個(gè)回掉函數(shù),用來把前邊的函數(shù)數(shù)組的參數(shù)打印出來

console.info([data], [...])

接收參數(shù):

接受若干個(gè)參數(shù)律适,如果只有一個(gè)參數(shù)违寿,則輸出這個(gè)參數(shù)的字符串形式萧豆。

如果有多個(gè)參數(shù)籍救,則以類似于C語言printf()命令的格式輸出。

如果沒有參數(shù)污茵,只打印一個(gè)換行符

下面這個(gè)例子是傳 json數(shù)據(jù)格式的函數(shù)組

var async = require('async');

async.series({

one:function(callback){

callback(null,'hello');

},

two:function(callback){

callback(null,'async');

},

three:function(callback){

callback(null,'results');

}

},function(err,results){

console.log(results);

});

console.info();

4.Async瀑布模式流程控制

console.info();

var async = require('async');

async.waterfall([

function(callback){

callback(null,1);

},

function(data,callback){

console.info(data);

callback('test',2);

},

function(data,callback){

console.info(data);

callback(null,3);

}

],function(err,results){

console.log(results);

});

console.info();

waterfall(tasks,[callback]);

(1)第一個(gè)參數(shù)只能是數(shù)組類型

(2)回掉函數(shù)callback的第一個(gè)參數(shù)如果是非空樱报,則流程在此結(jié)束。為空時(shí)才會(huì)繼續(xù)下去省咨,所以這里輸出的是1 2

3不會(huì)出來 第二個(gè)function的第一個(gè)參數(shù)是“test”非空 則停止了肃弟。

5.async 并行流程控制

console.info();

var async = require('async');

async.parallel([

function(callback){

setTimeout(function(){

callback(null,'one');

},2000);

},

function(callback){

setTimeout(function(){

callback(null,'two');

},1000);

}

],

function(err,results){

console.log(results);

});

console.info()

并行:兩個(gè)或兩個(gè)以上的事件或者活動(dòng)在同一時(shí)刻發(fā)生

async.paralle()函數(shù)就是并行執(zhí)行多個(gè)函數(shù)

paralle(tasks,[callback]);

第一個(gè)參數(shù)是一個(gè)函數(shù)數(shù)組或者json對(duì)象,類比series()函數(shù)

第二個(gè)參數(shù)是一個(gè)回掉函數(shù) 用于輸出前面函數(shù)的參數(shù)

但是注意 最終得到的結(jié)果 數(shù)據(jù)的順序是在Tasks函數(shù)數(shù)組的聲明順序 而不是執(zhí)行完成的時(shí)間 所以這里輸出的是 ?['one','two'] 盡管 第二個(gè)函數(shù)更快完成

6.async限制性并行流程控制

console.info()

var async = require('async');

async.parallelLimit([

function(callback){

setTimeout(function(){

callback(null,'one');

},1000);

},

function(callback){

setTimeout(function(){

callback(null,'two');

},1000);

}

],1,function(err,results){

console.log(results);

});

console.info();

parallelLimit()與paralle()類似

不同之處在于 前者parallelLimit(tasks,limits,[callback]);

有三個(gè)參數(shù) limits表示并發(fā)任務(wù)有數(shù)量限制

7.async的循環(huán)流程控制

console.info()

var async = require('async');

var count = 0;

var list = [

{name:'Jack',age:18},

{name:'Qin',age:20},

{name:'Li',age:17},

{name:'Liu',age:22},

{name:'sun',age:19}

];

async.whilst(

function(){

return count<5;

},

function(callback){

console.log(count);

list[count].age += 1;

count++;

setTimeout(callback,1000);

},

function(err){

console.log(count);

console.log(list);

}

);

這里用到了async的循環(huán)流程控制函數(shù) whilst()

參數(shù)有 whilst(test,fn,callback);第一個(gè)參數(shù)作為循環(huán)結(jié)束的條件零蓉,第二個(gè)參數(shù)是要異步執(zhí)行的操作 第三個(gè)參數(shù)是回掉函數(shù) 輸出結(jié)果

whilst()相當(dāng)于while語句 區(qū)別在于 異步調(diào)用是在完成以后才會(huì)進(jìn)行下次循環(huán)

相關(guān)函數(shù)還有 doWhilst() until() 與 doUntil() 這里就不一一展開 請自行查閱API

8.async隊(duì)列流程控制

console.info();

var async = require('async');

//定義了隊(duì)列

var q = async.queue(function(task,callback){

console.log('worker is processing task:',task.name);

callback();

},2);

q.push({name:'foo'},function(err){

console.log('finished processing foo');

});

q.push({name:'bar'},function(err){

console.log('finished processing bar');

});

q.push({name:'egg'},function(err){

console.log('finished processing egg');

});

q.push({name:'app'},function(err){

console.log('finished processing app');

});

//當(dāng)最后一個(gè)任務(wù)被執(zhí)行的前 會(huì)執(zhí)行 q.empty

q.empty = function(){

console.log('no more tasks wating')

}

//所有任務(wù)完成的時(shí)候 會(huì)調(diào)用該函數(shù)

q.drain = function(){

console.log('all tasks have been processed');

}

async.queue(worker,concurrency)

第一個(gè)參數(shù)worker是任務(wù)的回調(diào)函數(shù)的形式笤受,當(dāng)使用push()方法時(shí),對(duì)應(yīng)的參數(shù)被傳進(jìn)去 被worker執(zhí)行

第二個(gè)參數(shù)定義了一次worker同時(shí)執(zhí)行任務(wù)的數(shù)量上限

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敌蜂,一起剝皮案震驚了整個(gè)濱河市箩兽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌章喉,老刑警劉巖汗贫,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異秸脱,居然都是意外死亡落包,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摊唇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咐蝇,“玉大人,你說我怎么就攤上這事巷查∮行颍” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵岛请,是天一觀的道長旭寿。 經(jīng)常有香客問我,道長崇败,這世上最難降的妖魔是什么盅称? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮后室,結(jié)果婚禮上微渠,老公的妹妹穿的比我還像新娘。我一直安慰自己咧擂,他們只是感情好逞盆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著松申,像睡著了一般云芦。 火紅的嫁衣襯著肌膚如雪俯逾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天舅逸,我揣著相機(jī)與錄音桌肴,去河邊找鬼。 笑死琉历,一個(gè)胖子當(dāng)著我的面吹牛坠七,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旗笔,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼彪置,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝇恶?” 一聲冷哼從身側(cè)響起拳魁,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撮弧,沒想到半個(gè)月后潘懊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贿衍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年授舟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸辈。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡释树,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裙椭,到底是詐尸還是另有隱情,我是刑警寧澤署浩,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布揉燃,位于F島的核電站,受9級(jí)特大地震影響筋栋,放射性物質(zhì)發(fā)生泄漏炊汤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一弊攘、第九天 我趴在偏房一處隱蔽的房頂上張望抢腐。 院中可真熱鬧,春花似錦襟交、人聲如沸迈倍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啼染。三九已至宴合,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迹鹅,已是汗流浹背卦洽。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斜棚,地道東北人阀蒂。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像弟蚀,于是被迫代替她去往敵國和親蚤霞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Node.js 常用工具 util 是一個(gè)Node.js 核心模塊粗梭,提供常用函數(shù)的集合争便,用于彌補(bǔ)核心JavaScr...
    FTOLsXD閱讀 535評(píng)論 0 2
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,080評(píng)論 0 1
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情断医,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式滞乙。簡單...
    舟漁行舟閱讀 7,758評(píng)論 2 17
  • //公共引用 varfs =require('fs'), path =require('path'); 1、讀取文...
    才気莮孒閱讀 833評(píng)論 0 1
  • Module definition patterns 除了作為加載依賴的機(jī)制之外鉴嗤,模塊系統(tǒng)也是一種用于定義AP...
    宮若石閱讀 468評(píng)論 0 0