您現在的位置是:首頁 > 運動

node 模組 howdo 非同步流程控制

由 文江部落格 發表于 運動2023-02-06
簡介howdo 單次任務1

模組的DO是什麼意思

1、生活例子

例1:我一邊聽歌,一邊閱讀10次課文。在我們的大腦裡,現在已經分配了11個並行任務(一起做):

任務1:聽歌。

任務2-11:閱讀10次課文。

這11個任務是可以同時進行的。

例2:我開啟書本,然後閱讀10次課文。在我們的大腦裡,現在已經分配了11個序列任務(跟著做):

任務1:開啟書本。

任務2:在開啟書本之後,閱讀 10 次課文。

在現實生活中,我們不能處理大量的並行和序列任務,我們需要手動將我們的任務肢解開來,比如從早上到晚上這一天的時間,我們需要做很多事情。我們需要在大腦裡將任務按照某種順序分解開來。比如上午看書,下午打球,這兩件事是跟著做的,只有看完書之後才可以打球。然後上午先看語文,然後看數學,這也是一個序列任務(跟著做)。下午一邊打球,一邊和朋友聊天,這兩件事是並行的,是一起做的。

計算機的事情,需要我們人為去分配任務,我們可以參考我們的現實生活,把需要做的事情,按照並行和序列分開,簡化分配任務,然後小任務合成大任務。這樣,一件複雜的事情也可以按照分配情況預期完成。

2、howdo 的 API

howdo

的思想和上面說的生活例子是一樣的道理,把任務按照執行型別(一起做的還是跟著做的)分類開來,然後再去分配任務。

howdo

的API非常的簡潔,只有

#task

#each

#follow

#together

四個,而且使用非常簡單,可以鏈式混合使用,其中

#follow

#together

是鏈式終點。

2。1、#task 分配單次任務

分配單次任務是一個計劃過程,就是在任務執行之前約定好怎麼做。

var howdo = require(‘howdo’); howdo// 單次任務1。task(funtion(next) { next(null, 1, 2);})// 單次任務2。task(funtion(next, ret1, ret2) { // ret1 = 1 // ret2 = 2 next(null, ret1 + ret2);})// 跟著做。follow(function(err, ret3){ // ret3 = 3}); howdo// 單次任務1。task(funtion(done) { done(null, 1, 2);})// 單次任務2。task(funtion(done) { done(null, 3);})// 一起做。together(function(err, ret1, ret2, ret3) { // ret1 = 1 // ret2 = 2 // ret3 = 3});

#task

是可以鏈式操作的,每當開始執行task都會例項化一次新的任務計劃。如果鏈式不得不斷開的話,請先快取起來。

2。1、#each 分配批次任務

分配批次任務也是一個計劃過程,就是在任務執行之前約定好怎麼做。

var howdo = require(‘howdo’); howdo// 批次任務1。each([1, 2, 3], funtion(key, val, next) { next(err, val);})// 批次任務2。each({ a: 4, b: 5, c: 6,}, funtion(key, val, next, ret1) { next(err, ret1 + val);})// 跟著做。follow(function(err, ret) { // ret = 18 = 3 + 4 + 5 + 6}); howdo// 批次任務1。each([1, 2, 3], funtion(key, val, done) { done(err, val);})// 批次任務2。each({ a: 4, b: 5, c: 6,}, funtion(key, val, done) { done(err, val);})// 一起做。together(function(err, ret1, ret2, ret3, ret4, ret5, ret6) { // ret1 = 1 // ret2 = 2 // ret3 = 3 // ret4 = 4 // ret5 = 5 // ret6 = 6});

#each

也是鏈式操作的,可以與

#task

合起來用。

2。3、#follow 跟著做

任務分配好後,任務跟著做,只回調最後一次結果。

2。4、#together 一起做

任務分配好後,任務一起做,回撥任務順序的所有結果。

3、howdo的一些注意點

3。1、next 引數

和 nodejs 的約定一樣,next是回撥函式,第1個引數始終為 error 物件,為空表示無錯誤,不為空時該引數必須為 Error 物件的例項。next 意思是把當前任務結果傳遞給下一個任務。格式為:

howdo。task(function(next) { next(err, ret1, ret2, ret3, 。。。);});

3。2、done 引數

與 next 引數格式一致。它的使用場合是,把當前任務結果提交給總結。例如,大家把作業都統一交給班長,這個交作業的過程為 done。格式為:

howdo。task(function(done) { done(err, ret1, ret2, ret3, 。。。);});

如果

done

的結果非常的多,那麼在最後所有結果合併的時候,可能造成識別困難,因此推薦每一個任務只提交1個結果:

howdo。task(function(done) { done(err, ret);});

3。3、each 引數

each

是和

task

同級的,不同的作用是,

each

可以一次性定義批次任務。這些批次任務是可以並行也可以是序列的,非常的實用。

each

使用比較複雜,引數也非常的多,引數有:

howdo。each(object, function(key, val, next, prevRet1, prevRet2) { next(err, ret1, ret2, ret3, 。。。);}); howdo。each(object, function(key, val, done) { done(err, ret1, ret2, ret3, 。。。);});

- 引數1:是需要

each

的物件,可以是陣列和物件

- 引數2:是一個回撥函式

- 引數1:鍵

- 引數2:值

- 引數3:可以是

next

或者

done

剩餘引數:如果是

follow

的話,那麼剩下的引數為上一次傳遞下來的結果

3。4、follow 引數

follow

是鏈式終點,它也是回撥函式,因此第一個引數為錯誤標記,剩餘引數為最後一次任務的結果。

。follow(function(err, ret1, ret2, ret3) { // ret1 = 4 // ret2 = 5 // ret3 = 6});

如第1次任務結果為 1,第2次任務結果為 2、3,最後第3次任務結果為 __4、5、6__,那麼 __ret1、ret2、ret3 分別為 4、5 和 6__。

3。5、together 引數

together

也是鏈式終點,它也是回撥函式,因此第一個引數為錯誤標記,剩餘引數為所有任務的結果集合。

。totether(function(err, ret1, ret2, ret3, ret4, ret5, ret6) { // ret1 = 1 // ret2 = 2 // ret3 = 3 // ret4 = 4 // ret5 = 5 // ret6 = 6});

如第1次任務結果為 1,第 2 次任務結果為 2、3,最後第 3 次任務結果為 __4、5、6__,那麼 __ret1、ret2、ret3、ret4、ret5、ret6 分別為 1、2、3、4、5 和 6__。

推薦文章