快速理解和使用 ES7 await/async

await/async 是 ES7 最重要特性之一,它是目前為止 JS 最佳的異步解決方案了。雖然沒有在 ES2016 中錄入,但很快就到來,目前已經在 ES-Next Stage 4 階段。

直接上例子,比如我們需要按順序獲取:產品數據=>用戶數據=>評論數據

老朋友 Ajax

傳統的寫法,無需解釋

// 獲取產品數據
ajax('products.json', (products) => {console.log('AJAX/products >>>', JSON.parse(products));// 獲取用戶數據ajax('users.json', (users) => {console.log('AJAX/users >>>', JSON.parse(users));// 獲取評論數據ajax('products.json', (comments) => {console.log('AJAX/comments >>>', JSON.parse(comments));});});
});

不算新的朋友 Promise

Promise 已經被提及已久了,也是 ES6 的一部分。Promise 能消除 callback hell 帶來的厄運金字塔,相比起來代碼更清晰了,但還是達不到編寫同步代碼的直觀程度。

// Promise
// 封裝 Ajax,返回一個 Promise
function requestP(url) {return new Promise(function(resolve, reject) {ajax(url, (response) => {resolve(JSON.parse(response));});});
}// 獲取產品數據
requestP('products.json').then((products) => {console.log('Promises/products >>>', products);// 獲取用戶數據return requestP('users.json');
}).then((users) => {console.log('Promises/users >>>', users);// 獲取評論數據return requestP('comments.json');
}).then((comments) => {console.log('Promises/comments >>>', comments);
});

強勁的新朋友 Generators

Generators 也是 ES6 一個新的特性,能夠 暫停/執行 代碼。yield 表示暫停,iterator.next 表示執行下一步,如果你不了解 Generators 也沒關系,可以忽略它直接學習 await/async

// Generators
function request(url) {ajax(url, (response) => {iterator.next(JSON.parse(response));});
}function *main() {// 獲取產品數據let data = yield request('products.json');// 獲取用戶數據let users = yield request('users.json');// 獲取評論數據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 結合使用

// 封裝 Ajax,返回一個 Promise
function requestP(url) {return new Promise(function(resolve, reject) {ajax(url, (response) => {resolve(JSON.parse(response));});});
}(async () => {// 獲取產品數據let data = await requestP('products.json');// 獲取用戶數據let users = await requestP('users.json');// 獲取評論數據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 結合使用:

(async () => {
// Async/await using the fetch APItry {// 獲取產品數據let products = await fetch('products.json');// Parsing productslet parsedProducts = await products.json();// 獲取用戶數據let users = await fetch('users.json');// Parsing userslet parsedUsers = await users.json();// 獲取評論數據let comments = await fetch('comments.json');// Parsing commentslet 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);}
}());

再次結合 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 用同步的思維去解決異步的代碼,感覺非常酷非常爽!

參考文獻[原文]:https://github.com/jaydson/es...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397549.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jdeveloper優化:

D:\jdevstudio10133\jdev\bin\jdev.conf末尾加上下面的AddVMOption -Dsun.java2d.noddrawtrueAddVMOption -Dsun.java2d.ddoffscreenfalse 轉載于:https://www.cnblogs.com/sprinng/p/4780112.html

linux make java版本,告訴make是否在Windows或Linux上運行

更新請閱讀這個類似但更好的答案:https://stackoverflow.com/a/14777895/938111make (和 gcc )可以使用Cygwin或MinGW在MS-Windows上輕松安裝 .正如ldigas所說, make 可以使用 UNAME:$(shell uname) 檢測平臺(命令 uname 也由Cygwin或MinGW安…

MPI多機器實現并行計算

最近使用一個系統的分布式版本搭建測試環境,該系統是基于MPI實現的并行計算,MPI是傳統基于msg的系統,這個框架非常靈活,對程序的結構沒有太多約束,高效實用簡單,下面是MPI在多臺機器上實現并行計算的過程。…

Jenkins_獲取源碼編譯并啟動服務(二)

一、創建Maven項目二、設置SVN信息三、設置構建觸發器四、設置Maven命令五、設置構建后發郵件信息(參考文章一)六、設置構建后拷貝文件到遠程機器并執行命令來自為知筆記(Wiz)

php 判斷頁面加載完,所有ajax執行完且頁面加載完判斷

jquery ajax&load 方法導致 js效果不顯示或顯示后由于加載后ajax 重新布局頁面導致效果錯誤。解決思路:需要在ajax get post 或 load 等執行完后再去執行方法就不會由于他們沒執行完導致的最終錯誤。那么首先看load 方法定義:jQuery ajax - load() 方…

正確理解ThreadLocal

想必很多朋友對 ThreadLocal并不陌生,今天我們就來一起探討下ThreadLocal的使用方法和實現原理。首先,本文先談一下對ThreadLocal的理 解,然后根據ThreadLocal類的源碼分析了其實現原理和使用需要注意的地方,最后給出了兩個應用場…

2018.7.10 個人博客文章=利用ORM創建分類和ORM的內置函數

昨天的注冊收尾工作 其實就差了和MySql聯系起來的部分,這部分很簡單,首先要做的就是保存用戶通過from傳送過來的頭像文件: """ 保存頭像文件 """ file request.FILES.get(avatar) file_path os.path.join(st…

python 列表與元組的操作簡介

上一篇:Python 序列通用操作介紹 列表 列表是可變的(mutable)——可以改變列表的內容,這不同于字符串和元組,字符串和元組都是不可變的。接下來討論一下列表所提供的方法。 list函數 可以使用list函數來創建列表: list(Hello) [H,…

mfc嵌入matlab繪圖窗口,將matlab的圖嵌入MFC

【實例簡介】VS調用matlab畫圖模塊編譯成的動態鏈接庫,并在MFC顯示。【實例截圖】【核心代碼】3b0582a3-4ea8-4a61-ba33-e448be563b88└── 將matlab的圖嵌入MFC├── matlab_2010b與VS2008_混合編程的實現.pdf├── TestWithData│ ├── Debug│ │ ├─…

python multiprocessing 和tcp

#用類方法 服務端from socket import *from multiprocessing import Processimport osclass Myprocess(Process): def __init__(self, conn): self.conn conn super().__init__() def run(self): conn self.conn start True whil…

matlab 畫三維花瓶,精美花瓶建模教程

1、首先,草圖單位為mm,進入前視圖繪制如圖草圖,花瓶的基本形狀輪廓2、然后對草圖進行旋轉3、旋轉出曲面后,在頂部邊線新建一個基準面4、繼續在前視圖繪制草圖,如圖繪制一弧線5、然后進行旋轉6、可以得到圖示的兩個曲面…

PKI系統相關知識點介紹

公鑰基礎設施(Public Key Infrastructure,簡稱PKI)是目前網絡安全建設的基礎與核心,是電子商務安全實施的基本保障,因此,對PKI技術的研究和開發成為目前信息安全領域的熱點。本文對PKI技術進行了全面的分析…

android 打印java堆棧,Android打印堆棧

java打印堆棧方法一:異常對象打印堆棧Exception e new Exception("this is a log");e.printStackTrace();方法二:Log打印獲取異常的堆棧并打印Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));C\C打印堆棧方法一:…

實際算法項目工程上手日志C/C++

#pragma once 為了保證頭文件只被編譯一次,通常放在頭文件的頂部 #define IN #define OUT #define INOUT 這個只在邏輯上起作用, IN 表示輸入參數,指針指向的值不會修改; OUT 表示輸出參數,指針指向的值會修改&a…

Arduino 控制超聲波測距模塊

一.實物圖 二.例子代碼 用到數字2 和3 引腳,還有兩個就是vcc GND兩個陰腳,用模塊連線比較簡單 轉載于:https://www.cnblogs.com/caoguo/p/4785700.html

Linux安裝source-code-pro字體

2019獨角獸企業重金招聘Python工程師標準>>> 1.下載source-code-pro字體 從GitHub下載 https://github.com/adobe-fonts/source-code-pro/releases 2.解壓文件,將OTF格式的文件夾重新命名一下,這里我命名為source-code-pro,然后將…

dft對稱性 matlab實驗,數字信號處理實驗指導書(審)

(0???2?)上對X(ej?)均勻采樣得到?X(k)?X(ej?)??2?k/N??n???x(n)e?j2?kn/N 0?k?N?1可以看到X(k)也是頻域上的有限長序列,長度為N。序列X(k)稱為序列x(n)的N點DFT。N稱為DFT變換區間長度。 通常表示WN?e?j2?/N可將定義式表示為?X(k)??x(n)…

PI

并不是所有東西都可以套PI的,只有滿足上述這類的數學關系才可以。 轉速經過PI調節得到電流也是有原因的。從下圖中可以發現,轉速 k*Iq/s,s是拉普拉斯算子,所以也是滿足積分,比例關系的。 轉載于:https://www.cnblogs.…

AOP之AspectJ簡單使用

為什么80%的碼農都做不了架構師?>>> 參考文章: 使用AspectJ在Android中實現Aop 深入理解Android之AOP自動打印日志主要知識點: 主要是JPoint、pointcuts、advice以及他們之間的關系可以通過aj文件、或AspectJ注解的Java文件實現A…

matlab drawnow連成曲線,precision recall曲線Matlab實現

在用哈希進行檢索時,常會用到precision recall曲線對其性能進行定量評價。precision recall的定義在信息檢索評價指標中已做了詳細說明,這里再記錄一下precision recall的具體實現。precision recall曲線matlab一般使用的都是下面的版本:func…