我最近了解到 ES2017 內置了 async/await,但是我做了幾個專案,我需要需要包async才能使用 async/await。
有沒有一種簡單的方法可以告訴我什么時候可以正常訪問 async 或者什么時候需要匯入它?我需要使用那個 npm 包嗎?如果現在語言中內置了完全相同的功能,那么異步包(目前顯示每周下載 47,469,002 次)的目的是什么?
對于需要異步的示例專案,請隨時查看MDN上的Local-Library MongoDB/Express/Node 教程專案。
由于這是一個 Express 應用程式(就像我自己的幾個應用程式一樣),這與 ExpressJS 有什么關系嗎?
我環顧四周,試圖找到這些答案,但空手而歸。任何幫助理解這一點表示贊賞。
uj5u.com熱心網友回復:
asyncNPM 上的庫提供了許多用于管理異步操作的實用函式。這與async允許您使用awaitpromise的語言中的關鍵字非常不同。這些就像貓和狗。它們都與異步編程有關,但除此之外,它們根本不是一回事。
例如,假設您需要向特定主機發出 1000 個單獨的請求,但由于各種原因(記憶體消耗、主機的速率限制等),您對目標主機的請求不能超過 5 個在任何給定的時間。因此,您想要啟動 5 個請求,然后每次完成一個請求,您將啟動另一個請求,直到您最終完成所有 1000 個請求。
asyncES7 中的關鍵字也許可以用在一些自定義代碼中來實作我上面描述的演算法,但它本身并沒有給你那個解決方案。
而async來自 NPM的庫在它的工具包中有一個特定的功能來完成我所描述的。它被呼叫parallelLimit(),它可以讓您準確指定一次要并行執行的運算元(不超過)。事實上,該async庫包含各種用于管理異步控制流的實用函式,您可以在此處查看它們的完整串列:https : //caolan.github.io/async/v3/docs.html#parallelLimit。
現在我們async在語言中有了關鍵字,其中一些演算法不再需要,因為用普通的 ES7 編碼它們非常容易。例如,如果您想一次迭代一個陣列,在每個專案上呼叫一個異步函式,您可以只在一個函式中使用一個for回圈 and 。awaitasync
async function run() {
for (let x of myArray) {
await doSomeAsyncOperation(x);
}
}
在我們擁有ES7之前async和await在 ES7 中,您將不得不撰寫一些自定義代碼來執行此異步、序列化迭代,或者您將使用來自諸如庫之類的async庫的預構建函式。
概括
回顧一下,該async庫包含許多用于管理異步操作的實用函式。他們有些是因為控制流選項不再需要async并await提供ES7有的還樂于助人/有用的,即使存在async和await。
僅供參考,該async庫最初是在我們甚至沒有承諾之前開發的,并且是async/await在 Javascript 中開發的,它處理舊式的異步操作,這些操作使用簡單的回呼來表示完成或錯誤,并提供管理它們的實用程式。Promises 并async/await取代了對async庫中某些功能的需求,但不是全部。
何時使用 ES2017 內置的“async”或匯入“npm i async”
直接使用內置的ES7 async/await,簡單的解決你需要解決的異步控制流問題。當您無法輕松解決問題時,請使用異步庫中的函式,async/await并且該async庫包含一個預構建的函式,可以直接簡單地解決您的問題。
因此,該async庫只是 NPM 上成千上萬個庫中的一個。當它包含的內容比語言內置的內容更能幫助您解決作業時,您就可以使用它,這與何時使用 NPM 中的任何其他模塊的邏輯相同。
uj5u.com熱心網友回復:
作為 ES2017 一部分的 aysnc/await 通過避免承諾鏈來實作更簡潔的風格。請參閱以下 mdn 中提到的示例。您避免了像那時這樣的承諾鏈,捕獲并具有異步行為 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
您提到的異步庫更像是一個實用程式(它們主要設計用于與節點 js 一起使用),它采用回呼陣列,執行并包裝它們并給您一個承諾。Iy 還為您提供更多功能,例如如果您想并行、串行呼叫回呼、鏈接回呼,通過常見的成功/錯誤處理來幫助跟蹤這些
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/385239.html
標籤:javascript 节点.js 异步 新产品经理 异步等待
