iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
0
Modern Web

一步一腳印-紮紮實實學es6系列 第 29

非同步處理 ES7之 async await 入門

今天終於學到此圖的最後一個async
async.img

async

啥是async 呢
MDN

async function 宣告被定義為一個回傳 AsyncFunction 物件的非同步函式 。
你也可以使用 async function expression 來定義一個非同步函式。

Syntax

async function name([param[, param[, ... param]]]) {
statements
}

很好,MDN 的解釋我有87% 都看不懂

直接來看看怎麼用唄!

async function func(){
	return 'abc'
}
result=func();

咦我們來看一下,在function 前面加了async
執行的結果有什麼變化
https://ithelp.ithome.com.tw/upload/images/20181029/2011057980xOtb7yVM.png

我們發現這個result 並不是'abc'
而且一個Promise 實例

這邊他將一個非Promise 的東西轉成 Promise 實例
並且執行了Promise.resolve('abc');
所以這個result 都已經是resolve 的結果了
那我們來用一下then 看看能不能取到abc

https://ithelp.ithome.com.tw/upload/images/20181029/20110579obf8IwLqgg.png

哦哦果然如我們想的

接下來看一下await

await

這顧名思義,就是在等待某事的樣子

是不是跟generator 的yield 很像呢?

我們來寫一個async 裡面有awiat的

async function func(){
    const await1= await 'abc';
    const await2= await Promise.resolve('abc')
    console.log(await1,await2);
	
}
func();

在這邊我們發現 await 後面接的是一般資料型態
或是 Promise實例 都可以
https://ithelp.ithome.com.tw/upload/images/20181029/20110579y5gUMvBzdL.png

好了開胃菜吃完了,再來試試看怎麼改寫昨天的例子

看看是否有升天的感覺

這邊我們先寫promise 寫一個xhr request function
下面將會使用這個function 來實做
live demo請見 codepen (async.html,scripts/async.js)

const myAjaxP=url=>new Promise((resolve,reject)=>{
    const xhr=new XMLHttpRequest;
    xhr.open('GET',url);
    xhr.onreadystatechange=function(){
        if(this.readyState===4){
            if(this.status===20){
                resolve(this.response);
            }
            else{
                reject(new Error(this.statusText));
            }
        
        }
    
    };
    xhr.send();
});

好了 備料完成,接下來下鍋炒了!

async function asyncAjax(){
    divAll[0].innerHTML = await myAjaxP("../file/a.txt");
    divAll[1].innerHTML = await myAjaxP("../file/b.txt");
    divAll[2].innerHTML = await myAjaxP("../file/c.txt");
}
asyncAjax();

…連 next 也不用了...實在太爽了吧
這其實是generator 的語法糖
但他比generator 更猛的地方是
他可以寫箭頭函數(yield 不行)

所以可以更簡潔了!
終於,我們有了一個簡單易懂的非同步寫法!

老實說這幾天學得零零散散
想在30天內每天下班用一點時間來紮實學es6
好像有點不可能 XD
畢竟工作上沒用到
等鐵人賽完,再來更新補完這些文章(感覺這鐵人賽可以持續個90天 xddd)


上一篇
非同步處理工具-Generator(3) 非同步範例
下一篇
proxy(1)
系列文
一步一腳印-紮紮實實學es630

尚未有邦友留言

立即登入留言