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

首頁 > 語言 > JavaScript > 正文

淺談node.js中async異步編程

2024-05-06 16:24:45
字體:
來源:轉載
供稿:網友

本文嘗試結合Marc Fasel的指導思想和筆者的實踐經驗來介紹一些NodeJS的異步編程風格,希望對NodeJS的初學者有所啟發。

1.什么是異步編程?

異步編程是指由于異步I/O等因素,無法同步獲得執行結果時,

在回調函數中進行下一步操作的代碼編寫風格,常見的如setTimeout函數、ajax請求等等。

示例:

 

 
  1. for (var i = 1; i <= 3; i++) { 
  2. setTimeout(function(){ 
  3. console.log(i); 
  4. }, 0); 
  5. }; 

這里大部分人會認為輸出123,或者333。其實它會輸出 444

這里就是我們要說的異步編程了。

高級函數的定義

這里為什么會說到高級函數,因為高級函數是異步編程的基礎。

那什么是高級函數呢?

其實高級函數就是把函數作為參數或者是作為返回值。

示例:

 

 
  1. function test(v){ 
  2. return function(){ 
  3. return v; 

如上就是把一個函數作為一個返回值。

2.流程控制

函數有:

series

waterfall

parallel

parallelLimit

series函數 串行執行

它的作用就是按照順序一次執行。

 

 
  1. async.series({ 
  2. one: function(callback){ 
  3. callback(null, 1); 
  4. }, 
  5. two: function(callback){ 
  6. callback(null, 2); 
  7. },function(err, results) { 
  8. console.log(results); 
  9. }); 

輸出:{one: 1, two: 2}

series函數的第一個參數可以是一個數組也可以是一個JSON對象,

參數類型不同,影響的是返回數據的格式。

waterfall函數 瀑布流

waterfall和series函數有很多相似之處,都是按照順序執行。

不同之處是waterfall每個函數產生的值,都將傳給下一個函數,而series則沒有這個功能,示例如下:

 

 
  1. async.waterfall([ 
  2. function(callback){ 
  3. callback(null'one''two'); 
  4. }, 
  5. function(arg1, arg2, callback){ 
  6. // arg1 now equals 'one' and arg2 now equals 'two' 
  7. callback(null'three'); 
  8. }, 
  9. function(arg1, callback){ 
  10. // arg1 now equals 'three' 
  11. callback(null'done'); 
  12. ], function (err, result) { 
  13. // result now equals 'done' 
  14. console.log(result); 
  15. }); 

另外需要注意的是 waterfall 的 tasks 參數只能是數組類型。

當中途有函數出錯,其err直接傳給最終callback,結果被丟棄,后面的函數不再執行。

parallel(tasks, [callback])

parallel函數是并行執行多個函數,每個函數都是立即執行,不需要等待其它函數先執行。

傳給最終callback的數組中的數據按照tasks中聲明的順序,而不是執行完成的順序,示例如下:

 

 
  1. async.parallel([ 
  2. function(callback){ 
  3. callback(null'one'); 
  4. }, 
  5. function(callback){ 
  6. callback(null'two'); 
  7. ], 
  8. function(err, results){ 
  9.  
  10. }); 

tasks參數可以是一個數組或是json對象,和series函數一樣,

tasks參數類型不同,返回的results格式會不一樣。

parallelLimit(tasks, limit, [callback])

parallelLimit函數和parallel類似,但是它多了一個參數limit。

limit參數限制任務只能同時并發一定數量,而不是無限制并發,示例如下:

 

 
  1. async.parallelLimit([ 
  2. function(callback){ 
  3. callback(null'one'); 
  4. }, 
  5. function(callback){ 
  6. callback(null'two'); 
  7. ], 

2,

 

 
  1. function(err, results){ 
  2. console.log(results); 
  3. }); 

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

圖片精選

主站蜘蛛池模板: 河源市| 澄城县| 金乡县| 许昌市| 阜阳市| 石屏县| 抚宁县| 黑龙江省| 郓城县| 扶绥县| 海晏县| 文登市| 德化县| 灵武市| 印江| 双鸭山市| 巴彦淖尔市| 承德县| 江山市| 佳木斯市| 洞口县| 永定县| 宁河县| 山丹县| 安丘市| 黄石市| 封丘县| 怀来县| 会昌县| 云林县| 曲沃县| 青川县| 罗江县| 玉树县| 双柏县| 湘潭县| 辉南县| 白城市| 安阳市| 娄底市| 亳州市|