js async/await和Generator 的使用

async函數的幾個聲明方式:

//普通函數聲明
async function fn(){ }
//聲明一個函數表達式
let fn = async function(){ }
//async形式的箭頭函數
let fn = async ()=>{ }

async返回一個Promise對象,await命令後面對應的是Promise對象或值,如果是值,就會轉到一個立即resolve的Promise對象。async函數返回的是一個Promise對象,如果結果是指,會經過Promise包裝返回。

  1. await關鍵字必須位於async函數內部
  2. await關鍵字後面需要有一個promise對象
  3. awiat關鍵字返回結果就是其後面promise執行的結果,可能是resolved或者rejected的值
    寫法如下:
//創建方式1
export const testAsyncFn = async (data) => {
    return request(
        url:addPath +/goods/api’
        method:’post’,
        data
    )
}
//創建方式2
export function testAsyncFn(data){    
    return request(
        url:addPath +/goods/api’
        method:’post’,
        data
    }
}
//調用方式
async foo(){
    try{
        let res = await testAsyncFn({
            name,
            size:this.size,
            type:this.type
        })
        console.log(res)
    }catch(err){
        console.log(err)
    }
}
this.foo()

async/await和Generator
Generator函數:Generator(生成器)是ES6標準引入的新的數據類型。一個Generator看上去像一個函數,但是可以返回多次。下面是一個Generator函數的簡單寫法。

function* Generator(){
    yield111;
    yield222;
    return333;
}
let aaa = Generator();

Generator函數和普通函數一樣通過函數名+()去調用,但是調用完之後並不執行。它僅僅是創建了一個Generator對象,還沒有去執行它。想要運行Generator函數,需要通過遍歷對象的next方法。

let a = aaa.next()
let b = aaa.next()
let c = aaa.next()
let b = aaa.next()
console.log(a,b,c,d)// {value: "11111111", done: false} {value: "22222222", done: false} {value: "3333333", done: true} {value: undefined, done: true}

想要Generator函數執行下一步,必須調用遍歷器對象的next方法,使得指針移向下一個狀態。也就是說,每次調用next方法,內部指針就從函數頭部或上一次停下來的地方開始執行,直到遇到下一個yield表達式或者return語句。由此可見,Generator函數是分段執行的,yield表達式是暫停執行的標記,而next方法可以恢復執行。也就是上面說的可以交出函數的執行權

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章