1. 程式人生 > >關於await和async

關於await和async

async的意思是非同步
await的字面意思是等一下

還是比較形象的,通常來說,作為ES7的語法標準,async一般修飾一個函式,說明這個函式是非同步的。await一般是用來執行非同步操作的,很多情況下它的後面會跟著Promise物件

async和await提出的意義在於:用同步的方式處理非同步!!

定時器是最常見的非同步操作,先用它定義一個非同步函式。

function sleep(){
    setTimeout(()=>{
        return 1
    },3000)
}

因為await後面跟著的是一個Promise物件。就把它封裝一下:

let sleep
= () =>
{ return new Promise((resolve,reject)=>{ setTimeout(() => { resolve(2); },3000) }) } async function aaa() { let i = await sleep() console.log(i); } aaa();

最終這樣使用出來,3秒之後打印出2。但是如果sleep不用Promise封裝,列印的就是undefined。

await可以非同步執行一個函式。通常用於執行一個回撥函式,await next();

需要注意的地方:除了await後面跟一個Promise,await必須在async定義的函式中使用。

關於async和await的詳細說明:

1、無論函式中是否是非同步的,async定義的函式的返回值都是promise。

async function getName() {
    return 'mapbar_front';
}
console.log(getName());//resolved Promise

上面的這個函式,返回值是一個被注入的Promise物件,注入的值是 ‘mapbar_front’ 這樣的一個字串。

當然,如果上面的函式沒有返回值,它的執行結果依然是Promise物件,而且被注入的值是undefined。

2、await可以取得的值是Promise注入的值,而不是Promise。

async function getName() {
    return 'mapbar_front';
}
console.log(getName());//resolved Promise
async function doIt() {
    const data = await getName();
    console.log(data);//mapbar_front
}
doIt();

3、解決了什麼問題?

回撥函式是前端的一大弊病。

Promise解決了回撥函式的層層巢狀的痛楚。

而async和await是基於Promise的語法糖,從使用上來說,更加的清晰簡潔。

4、關於async和await的弊病是什麼?

弊病一:async語法是ES7的標準,所以會存在相容性問題。需要使用babel的解析。

弊病二:await必須配合async使用,但是我們想做到,把await得到的值,return出去,這個需求就做不到,一般return出去的值是一個pedding Promise物件。

function step() {
   return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve(1234)
        },1000)
    })
}
async function doIt() {
    const result = await step();
    console.log(result);//1234
    return result
}
doIt();//打印出1234
console.log(doIt());//Promise物件