摘要:是最重要特性之一,它是目前為止最佳的異步解決方案了。雖然沒有在中錄入,但很快就到來,目前已經(jīng)在階段。表示暫停,表示執(zhí)行下一步,如果你不了解也沒關(guān)系,可以忽略它直接學(xué)習(xí)。
await/async 是 ES7 最重要特性之一,它是目前為止 JS 最佳的異步解決方案了。雖然沒有在 ES2016 中錄入,但很快就到來,目前已經(jīng)在 ES-Next Stage 4 階段。
直接上例子,比如我們需要按順序獲取:產(chǎn)品數(shù)據(jù)=>用戶數(shù)據(jù)=>評(píng)論數(shù)據(jù)
老朋友 Ajax傳統(tǒng)的寫法,無需解釋
// 獲取產(chǎn)品數(shù)據(jù) ajax("products.json", (products) => { console.log("AJAX/products >>>", JSON.parse(products)); // 獲取用戶數(shù)據(jù) ajax("users.json", (users) => { console.log("AJAX/users >>>", JSON.parse(users)); // 獲取評(píng)論數(shù)據(jù) ajax("products.json", (comments) => { console.log("AJAX/comments >>>", JSON.parse(comments)); }); }); });不算新的朋友 Promise
Promise 已經(jīng)被提及已久了,也是 ES6 的一部分。Promise 能消除 callback hell 帶來的厄運(yùn)金字塔,相比起來代碼更清晰了,但還是達(dá)不到編寫同步代碼的直觀程度。
// Promise // 封裝 Ajax,返回一個(gè) Promise function requestP(url) { return new Promise(function(resolve, reject) { ajax(url, (response) => { resolve(JSON.parse(response)); }); }); } // 獲取產(chǎn)品數(shù)據(jù) requestP("products.json").then((products) => { console.log("Promises/products >>>", products); // 獲取用戶數(shù)據(jù) return requestP("users.json"); }).then((users) => { console.log("Promises/users >>>", users); // 獲取評(píng)論數(shù)據(jù) return requestP("comments.json"); }).then((comments) => { console.log("Promises/comments >>>", comments); });強(qiáng)勁的新朋友 Generators
Generators 也是 ES6 一個(gè)新的特性,能夠 暫停/執(zhí)行 代碼。yield 表示暫停,iterator.next 表示執(zhí)行下一步,如果你不了解 Generators 也沒關(guān)系,可以忽略它直接學(xué)習(xí) await/async。
// Generators function request(url) { ajax(url, (response) => { iterator.next(JSON.parse(response)); }); } function *main() { // 獲取產(chǎn)品數(shù)據(jù) let data = yield request("products.json"); // 獲取用戶數(shù)據(jù) let users = yield request("users.json"); // 獲取評(píng)論數(shù)據(jù) let products = yield request("comments.json"); console.log("Generator/products >>>", products); console.log("Generator/users >>>", users); console.log("Generator/comments >>>", comments); } var iterator = main(); iterator.next();碉堡的朋友 await/async
與 Promise 結(jié)合使用
// 封裝 Ajax,返回一個(gè) Promise function requestP(url) { return new Promise(function(resolve, reject) { ajax(url, (response) => { resolve(JSON.parse(response)); }); }); } (async () => { // 獲取產(chǎn)品數(shù)據(jù) let data = await requestP("products.json"); // 獲取用戶數(shù)據(jù) let users = await requestP("users.json"); // 獲取評(píng)論數(shù)據(jù) let products = await requestP("comments.json"); console.log("ES7 Async/products >>>", products); console.log("ES7 Async/users >>>", users); console.log("ES7 Async/comments >>>", comments); }());
與 Fetch API 結(jié)合使用:
(async () => { // Async/await using the fetch API try { // 獲取產(chǎn)品數(shù)據(jù) let products = await fetch("products.json"); // Parsing products let parsedProducts = await products.json(); // 獲取用戶數(shù)據(jù) let users = await fetch("users.json"); // Parsing users let parsedUsers = await users.json(); // 獲取評(píng)論數(shù)據(jù) let comments = await fetch("comments.json"); // Parsing comments let parsedComments = await comments.json(); console.log("ES7 Async+fetch/products >>>", parsedProducts); console.log("ES7 Async+fetch/users >>>", parsedUsers); console.log("ES7 Async+fetch/comments >>>", parsedComments); } catch (error) { console.log(error); } }());
再次結(jié)合 Fetch
(async () => { let parallelDataFetch = await* [ (await fetch("products.json")).json(), (await fetch("users.json")).json(), (await fetch("comments.json")).json() ]; console.log("Async parallel+fetch >>>", parallelDataFetch); }());
使用 await/async 用同步的思維去解決異步的代碼,感覺非常酷非常爽!
參考文獻(xiàn)[原文]:https://github.com/jaydson/es...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80651.html
摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:更好的語義和分別表示異步和等待,比起和更容易理解。前邊聲明關(guān)鍵字,表示內(nèi)部有內(nèi)部操作,調(diào)用函數(shù)會(huì)返回一個(gè)對象。等價(jià)于其中函數(shù)就是自動(dòng)執(zhí)行器。 async函數(shù) 定義 async函數(shù)其實(shí)就是之前說過的Generator的語法糖,用于實(shí)現(xiàn)異步操作。它是ES2017的新標(biāo)準(zhǔn)。 讀取兩個(gè)文件: const fs = require(fs) const readFile = function(f...
摘要:有兩個(gè)陌生的關(guān)鍵字,同時(shí)函數(shù)執(zhí)行結(jié)果似乎返回了一個(gè)對象。用來表示函數(shù)是異步的,定義的函數(shù)會(huì)返回一個(gè)對象,可以使用方法添加回調(diào)函數(shù)。如果的是對象會(huì)造成異步函數(shù)停止執(zhí)行并且等待的解決如果等的是正常的表達(dá)式則立即執(zhí)行。 視頻講解 關(guān)于異步處理,ES5的回調(diào)使我們陷入地獄,ES6的Promise使我們脫離魔障,終于、ES7的async-await帶我們走向光明。今天就來學(xué)習(xí)一下 async-a...
摘要:原文地址原文作者翻譯作者是在版本中引入的,它對于中的異步編程而言是一個(gè)巨大的提升。可能會(huì)產(chǎn)生誤導(dǎo)一些文章把和進(jìn)行了比較,同時(shí)說它是異步編程演變過程中的下一代解決方案,對此我不敢茍同。結(jié)論在中引入的關(guān)鍵字無疑是對異步編程的一大加強(qiáng)。 原文地址: https://hackernoon.com/javasc...原文作者: Charlee Li 翻譯作者: Xixi20160512 asy...
閱讀 8892·2021-11-18 10:02
閱讀 2578·2019-08-30 15:43
閱讀 2651·2019-08-30 13:50
閱讀 1363·2019-08-30 11:20
閱讀 2701·2019-08-29 15:03
閱讀 3623·2019-08-29 12:36
閱讀 926·2019-08-23 17:04
閱讀 613·2019-08-23 14:18