警告
請勿將此軟件包作為依賴關係安裝! (請參閱:入門)
當前,承諾是處理JavaScript中異步任務的事實上的方式,因此,它們是任何JavaScript開發人員知識的基本組成部分。
但是,當我們第一次學習的承諾時,我們只學會了足夠的學習,即,我們學到了一些如何使用承諾(如今,最有可能僅使用async/await ), Promise.all Method。就是這樣。
儘管這種方法對初學者來說是有意義的,因為它足以解決他們日常生活中的大多數問題,但反復出現的問題是,他們停在那裡,也就是說,他們永遠不會超越最初的知識。
正是這種“學到足以獲得”的姿勢,使許多開發人員處於目前的水平,因為解決更複雜的問題需要更深入的了解。
因此,如果您想將開發人員的技能提升到一個新的水平,在淺水中游泳不會削減它,您必須更深入地,您需要完全了解承諾以及如何工作,您需要精通async/await / then/catch promise的承諾處理方式,並能夠以最有效的方式解決異步的任務。
同樣,由於承諾最終是處理異步任務的抽象,因此必須解決與異步編程有關的常見問題。
考慮到這一點,我們精確地創建了這個項目,以幫助您深入了解諾言和異步編程。
通過提供圍繞這些主題的解釋和實踐練習,該項目旨在成為您掌握這些主題的同伴。
即使您已經是經驗豐富的開發人員,您也可能會學到一兩件事,例如,您可能想嘗試解決concrete/parallelMaxConcurrency , concrete/concurrencyOverride , concrete/extractingResolvers和/foundation/promise因為它們帶來了一些有趣的挑戰。
重要的
該項目並非針對第一次學習承諾的人,因為它假設您至少對承諾,他們所代表的內容以及如何使用async/await和then/catch有一些基本知識。
警告
注意:除非您是最終用戶,否則此存儲庫不應被克隆
首先,要安裝項目,運行:
npm create promises-training@latest筆記
該項目是鍛煉驅動的,因此主要目標是解決它們。
有時,會有解釋以及練習,以幫助您了解需要做的事情,以及有關解決問題的背景。
練習分為三類:
重要的
沒有針對類別的特定順序,您可以從其中任何一個開始,甚至可以在完全完成另一個類別之前切換到另一個類別。但是,練習的級別不同,接下來將討論。
練習位於src/exercises/<category>文件夾中,其中<category>是上面提到的類別之一。
對於圖形練習,基本解釋位於此讀數中,在圖表部分中,對於每個練習,都有一個graph.png描繪了該特定練習的依賴關係圖。
對於混凝土和粉底練習,解釋位於練習夾內的README.md中(例如src/exercises/concrete/parallelChunks/README.md )。
要解決練習,您需要編輯src/exercises/<category>/<exercise>/exercise.ts文件。
解決練習後,您可以通過運行檢查解決方案:
npm run check < category > / < exercise >測試位於src/tests中。
通常,您只會在練習文件夾中工作,因為設計測試的方式可以告訴您不必查看其實現的問題,但是如果出於任何原因,您可能會陷入困境或好奇,則可以窺視它們。
src/lib文件夾僅用於內部用途,因此請勿打擾它。
另外,要使安裝向前與未來版本兼容,請勿修改src/exercises文件夾之外的任何文件。
除類別外,練習還分為水平,在您通過級別進行時,練習的難度會增加。
有三個級別:
請記住,此分類有些主觀,因此YMMV,您也不一定需要在一個水平上完成所有練習才能移至下一個練習。
筆記
如您所見,目前沒有太多的高級練習,但是想法是隨著時間的推移將添加新的練習。
每個練習都伴隨自動測試,因此您可以檢查解決方案。
要運行一個練習的測試,請運行:
npm run check < category > / < exercise >例如,要運行parallelChunks練習的測試,請運行:
npm run check concrete/parallelChunks或者,要運行圖2號練習,請運行:
npm run check graph/2/test.test.ts筆記
在上一個示例中,我們需要將/test.test.ts附加到練習文件上,否則它也將用於以2開頭的其他圖形練習運行,例如:練習2至29。
我們將Vitest用作測試跑者,因此所有CLI選項均可使用。
同樣,重要的是要提到,圖形練習具有一些特殊性,因為它們是從圖本身自動生成的,因此,有些練習有大量的測試(某些練習具有超過100K測試)。
當然,我們不會運行所有這些,因為它會非常慢,因此我們只運行其中的一個子集,並且可以調整運行的測試數量和子集的測試數量。
您可以在“圖形練習”部分中閱讀更多內容。
目前,有三個運動類別:
處理異步任務的很大一部分是策劃它們,以便每個任務盡快啟動,並正確協調這些任務,我們需要了解它們之間的依賴關係。
在此類別中,您將在每個練習中都有一個依賴圖,然後您將以最有效的方式在圖中進行任務。
由於練習專注於編排本身,因此通過調用createPromise(label)創建任務,其中label是標識任務的字符串。
以此圖為例:

該圖中有兩個任務, A和B , B取決於A ,該任務由從B出來並指向A箭頭表示。
這意味著B只有在A完成後才開始,並且A (不取決於任何其他任務)可以立即開始。
因此,該圖最有效的實現將是:
await createPromise ( "A" ) ;
await createPromise ( "B" ) ;任務還可以取決於多個任務:

在此圖中, C取決於A和B ,因此只有在A和B完成後才可以啟動。
但是, A和B都不依賴於任何其他任務,因此它們可以立即開始。
該圖最有效的實現將是:
await Promise . all ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;任務還可以具有多個不同的依賴關係集,如果滿足任何集合,則可以啟動任務:

在此圖中, C取決於A或B上,該圖是通過為每個依賴關係集使用不同顏色表示的。顏色本身沒有任何特定的含義,它們像這樣使用了,因此依賴關係彼此區分。
因此, C可以在A或B完成後立即開始。
await Promise . any ( [ createPromise ( "A" ) , createPromise ( "B" ) ] ) ;
await createPromise ( "C" ) ;最後但並非最不重要的一點是,承諾有兩個可能的結果:可以實現或拒絕。

在此圖中,我們的任務B取決於A的滿足和任務C ,取決於A的拒絕。
重要的
虛線邊緣用於表示承諾拒絕。
這意味著B只有在實現A後才開始,並且C只有在A拒絕後才能開始。
由於可能只有這些結果之一,因此B或C將進行。
相應的實現:
try {
await createPromise ( "A" ) ;
try {
await createPromise ( "B" ) ;
} catch { }
} catch {
await createPromise ( "C" ) ;
}進行圖形練習時,您會注意到三個功能正在導出: mixed , asyncAwait , thenCatch 。
這個想法是為您提供3種不同的實現:
mixed :這是完全免費的,您可以混合異步/等待,然後/捕獲asyncAwait :在此中,您應該只使用異步/等待thenCatch :在此中,您只應使用/捕獲。這樣,您將精通兩種承諾處理方式。
另外,在文件的末尾,您會注意到出口被包裹在skipExercise中,該skipecercise跳過了該特定實現的測試,以免輸出輸出。
當您為這三個方面實現解決方案時,請刪除要運行測試的實現的skipExercise調用。例如:如果您已經實施了mixed解決方案,請從中刪除skipExercise ,但將其保留為asyncAwait和thenCatch直到實現它們為止。
為了幫助您調試圖形練習的實現,我們創建了一個UI,允許您模擬不同的執行“路徑”。
要打開UI,請運行:
npm run graph:uiUI用作網絡應用程序,看起來像這樣。

現在讓我們探索每個部分:

左側的側邊欄使您可以選擇要調試的練習。

此頂部部分允許您選擇要調試的實現。

右側欄可讓您通過解決/拒絕承諾來控制練習的執行流。
由於創建了承諾,側邊欄中添加了新條目。

中心的本節顯示了在每個步驟中創建和解決/拒絕的承諾的記錄。

底部的本節顯示了按順序解決/拒絕的承諾的摘要。
由於圖形練習是基於圖形(DUH)的,因此可以自動為給定練習生成所有可能的測試,這就是我們要做的。
正如人們可能想像的那樣,生成的測試的數量有時很大,因此我們在運行的最大測試數量上有一個上限。
另外,為了防止偏見,我們不會按照生成的順序進行測試,而是將其洗牌。
這種改組會在測試首次生成之後就會發生,因此測試是確定性的,也就是說,每次運行圖形練習測試時,您都會運行相同的測試子集。
但是,可以調整運行的測試的蓋子和子集。
要調整帽子,您可以運行npm run graph:setGraphTestsCap <number> 。
例如,要將上限設置為10000,請運行:
npm run graph:setGraphTestsCap 10000要調整運行的測試子集,您可以運行npm run graph:shuffleGraphTestData <graph-exercise-number> ,它將改組指定的圖形練習的測試,然後導致不同的測試子集。
例如,為了重新填充圖2的圖表測試,請運行:
npm run graph:shuffleGraphTestData 2圖形練習非常適合理解任務之間的依賴關係,但是,它們並不能涵蓋可能的方案的完整範圍,因為只有其依賴關係在編譯時已知並且固定的任務可以由圖表表示。
因此,我們有這種類別的具體練習,您將為您提供必須實現的具體場景。
由於此類別中的每個練習都是獨一無二的,因此它們的描述與文件夾共歸入。
基礎練習旨在通過重新實現與承諾相關的職能以及最終的承諾本身來幫助您加強對承諾基礎的理解。
描述與練習一起進行。
練習的解決方案可以在此倉庫中找到,例如https://github.com/henriqueinonhe/promises-training/blob/master/src/src/exercises/concrete/concrete/concurrencyabort/exercise.ts。
但是,我們建議您自己解決練習後僅檢查解決方案,因為目標是通過解決練習來學習。
另外,請記住,目前提出的解決方案不一定是最好的解決方案,這意味著即使您的解決方案根本不像您在這裡找到的解決方案,也不意味著它們是不好的。
為了簡化升級到新版本,我們創建了一個遷移腳本,該腳本將您的安裝自動遷移到最新版本,同時保留解決方案。
要運行遷移腳本,請運行:
npm create promises-training@latest -- --migrate該項目已根據CC-BY-NC-ND 4.0許可。
該項目背後的目標是成為免費的學習資源,並使其永遠保持自由且可訪問。
這是有關許可證的一些常見問題的問答:
我可以使用這個項目進行自我研究嗎?
是的,請這樣做。
我可以在內部公司培訓中使用這個項目嗎?
是的,只要您相信該項目,並明確該項目獨立於培訓就可以自由訪問。
我可以將這個項目用於我的付費指導/研討會會議嗎?
是的,只要您歸功於該項目,請明確指出該項目獨立於指導/研討會獨立於自由訪問,請清楚地表明,您正在為您的時間而不是為項目本身充電,請清楚地表明該項目不是您自己的材料的一部分,並明確表明我們不認可您或您的服務。
我可以將這個項目用於我的付費在線課程嗎?
是的,只要您歸功於該項目,請明確指出該項目獨立於在線課程上可以自由訪問,請清楚地表明您是在收費,而不是為項目本身收費,請清楚地表明,該項目不是您自己的材料的一部分,並明確表示我們不認可您或您的服務。
我可以創建該項目的叉子並將其用於我自己的目的嗎?
不,你不能。您只能按原樣使用此項目,而無需任何修改。這是防止人們創建叉子然後為他們收取費用的必要條件。
我可以根據這個項目創建在線課程嗎?
不,您不能,因為我們不希望人們圍繞這個項目創建“包裝紙”,然後為他們收費。
如果您對許可證有任何疑問,或想談論特定用例,請隨時通過[email protected]與我聯繫。