摘要:的出現,讓我們可以走出回調地獄,著實驚艷。我已經開始使用里的和關鍵字來簡化的處理。異步任務在這個例子是執行之后,一直在執行完成才繼續下一個任務并沒有產生阻塞。最后這個函數處理了返回值并且返回了一個對象。依然很棒,但和使得它可維護性更好。
JavaScript Promises的出現,讓我們可以走出回調地獄,著實驚艷。Promises 允許我們更好的引入和處理異步任務,雖然如此,但引入好多的 then 還是會讓代碼變的混亂。我已經開始使用 ES2017 里的 async 和 await 關鍵字來簡化 promises 的處理。讓我們一睹 async 和 await 的風采!
快速入門async 是函數聲明的關鍵字
await 用于 promises 處理過程中
await 必須用在 async 聲明的函數內部,雖然 Chrome 已經支持“頂級的”的 await
async 函數返回 promises 對象,不關心函數的返回值是什么
async/await 和 promises 的底層實現是一樣的
大多數瀏覽器和 Nodejs 已經可用
async 和 await 的好處代碼更加清晰簡潔
更少的回調,調試更加簡單
容易從 promises 中的 then / catch 轉換
代碼看起來自上而下,更少的縮進。
async 和 await 簡介從實例入手要更簡單,我們先來看一個簡單的 async/await 的使用方法:
// 使用 async 定義函數,然后 await 才能使用 async function fetchContent() { // Instead of using fetch().then, use await let content = await fetch("/"); let text = await content.text(); // async 函數內,text 是響應值 console.log(text); // Resolve this async function with the text return text; } // Use the async function var promise = fetchContent().then(...);
首先使用 async 聲明函數;聲明之后,await 可以用在該函數內部。await 關鍵字后面跟 promise:fetch API。異步任務(在這個例子是 fetch)執行之后,一直在執行完成才繼續下一個任務(并沒有產生阻塞)。最后這個函數處理了返回值并且返回了一個 promises 對象。
代碼自上而下,告別回調,異步處理變的更加簡單!
轉換 Promise 為 await當時間允許,你一定很想將你的 promise 的代碼升級到 await,讓我們看下該怎么做:
// Before: callback city! fetch("/users.json") .then(response => response.json()) .then(json => { console.log(json); }) .catch(e => { console.log("error!"); }) // After: no more callbacks! async function getJson() { try { let response = await fetch("/users.json"); let json = await response.json(); console.log(json); } catch(e) { console.log("Error!", e); } }
從使用多個 then 到 await 十分簡單,但你的代碼的維護性變得很高。
async / await 模式聲明 async 函數有以下方式:
匿名 Async 函數let main = (async function() { let value = await fetch("/"); })();Async 函數聲明
async function main() { let value = await fetch("/"); };Async 函數賦值
let main = async function() { let value = await fetch("/"); }; // Arrow functions too! let main = async () => { let value = await fetch("/"); };Async 函數作為參數
document.body.addEventListener("click", async function() { let value = await fetch("/"); });對象和類方法
// Object property let obj = { async method() { let value = await fetch("/"); } }; // Class methods class MyClass { async myMethod() { let value = await fetch("/"); } }
正如你看到的,增加 async 函數十分簡單,而且能很好的適用各種函數創建的流程。
錯誤處理傳統的 promises 允許使用 catch 回調處理 rejection,當你使用 await,最好使用 try/catch:
try { let x = await myAsyncFunction(); } catch(e) { // Error! }
老式的 try/catch 不如 promises 的 catch 優雅,但在這里,它很給力!
并行Google 的Jake Archibald在Async functions document中提出了一個完美的觀點:不要用 await 使得任務變的太序列化。也就是說對于可以同時執行的任務,先觸發任務然后再使用 await,而不是直接使用 await 使得任務像堆棧式一樣的存儲。
// Will take 1000ms total! async function series() { await wait(500); await wait(500); return "done!"; } // Would take only 500ms total! async function parallel() { const wait1 = wait(500); const wait2 = wait(500); await wait1; await wait2; return "done!"; }
第一個代碼塊反面例子,第二個 await 需要等待第一個 await 執行完畢后才執行,第二個代碼塊是一個更好的方法,同時觸發了兩個任務,然后才使用 await;這樣做可以使得多個異步操作同時執行!
Promise.all 等價方式Primises API 中我最愛的 API 之一就是 Promise.all:當多有任務完成后才會觸發回調。async / await 中沒有等價的操作,但是這篇文章提供了一個很好的解決方案:
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
請記住,async / await和 promises 在底層實現上是一致的,所以我們可以簡單的等待(await)所有的 promises 任務結束!
現在大多數瀏覽器都可以使用 async 和 await,Nodejs 一樣可用,老版本的Nodejs可以使用 transform-async-to-generator 這個 babel 插件來使用 async 和 await。Promises 依然很棒,但 async 和 await 使得它可維護性更好。
原文地址:https://davidwalsh.name/async...
博客原地址:http://zhaojizong.online/post...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91815.html
摘要:譯數組循環的幾個坑原文地址原文作者在循環中使用循環遍歷數組似乎很簡單,但是在將兩者結合使用時需要注意一些非直觀的行為。循環的情況問題如上述代碼能夠正常執行。但我還是喜歡循環帶來的簡潔和高可讀性。 [譯]async-await 數組循環的幾個坑 原文地址:https://medium.com/dailyjs/th... 原文作者:Tory Walker 在 Javascript 循...
摘要:所以是在一秒后顯示的。這個行為不會耗費資源,因為引擎可以同時處理其他任務執行其他腳本,處理事件等。每個回調首先被放入微任務隊列然后在當前代碼執行完成后被執行。,函數是異步的,但是會立即運行。否則,就返回結果,并賦值。 「async/await」是 promises 的另一種更便捷更流行的寫法,同時它也更易于理解和使用。 Async functions 讓我們以 async 這個關鍵字開...
摘要:最近項目中用的比較多,所以特地去了解,模仿一下實現先來看看使用的方法通過是通過使用生成器配合方法模擬的一個同步操作,這個技術有效的避免了傳統回調和形成的回調地獄。 最近項目中 asyn & await 用的比較多,所以特地去了解,模仿一下實現~ 先來看看 使用 async & await 的方法 async function d () { try { const a = a...
摘要:但是中的這種情況與抽象反應器模式如何描述完全不同。在處理一個階段之后并且在移到下一個隊列之前,事件循環將處理兩個中間隊列,直到中間隊列中沒有剩余的項目。如果沒有任務則循環退出,每一次隊列處理都被視為事件循環的一個階段。 Promise && async/await的理解和用法 為什么需要promise(承諾)這個東西 在之前我們處理異步函數都是用回調這個方法,回調嵌套的時候會發現 閱讀...
閱讀 1776·2021-10-11 10:57
閱讀 2366·2021-10-08 10:14
閱讀 3405·2019-08-29 17:26
閱讀 3366·2019-08-28 17:54
閱讀 3035·2019-08-26 13:38
閱讀 2914·2019-08-26 12:19
閱讀 3620·2019-08-23 18:05
閱讀 1289·2019-08-23 17:04