天天看點

JavaScript異步之Generator、async、await

Generator

Generator允許我們在函數執行過程中暫停,并在将來某一個時刻回複執行。改變例以往函數必須執行完成才傳回的特點。 整個 Generator 函數就是一個封裝的異步任務,或者說是異步任務的容器。異步操作需要暫停的地方,都用 yield 語句注明

function* example(){
    yield ;
    yield ;
    yield ;
}
let iter=example();
iter.next();//{value: 1, done: false},傳回一個由yield表達式生成的值
iter.next();//{value: 2, done: false}
iter.next();//{value: 3, done: false}
iter.next();//{value: undefined, done: true}//生成器結束
let iter2=example();
iter2.return();//給定傳回值,并結束生成器{value: 75, done: true}
itet2.next();//{value: undefined, done: true}//生成器結束
let iter3=example();
iter3.return();//{value: undefined, done: true}//生成器結束
複制代碼
           

Generator.prototype.throw()//抛出異常

async await(Generator的文法糖)

async function

關鍵字用來在表達式中定義異步函數。

  • await

    操作符用于等待一個

    Promise

    對象。隻能在異步函數

    async function

    中使用。
  • await

    傳回

    promise

    的操作對象的傳回結果-如果

    promise

    正常處理,其回調函數resolve函數參數作為

    await

    表達式的值繼續執行

    async function

    ,如果執行錯誤,await 表達式會把

    Promise

    的異常原因抛出,
  • 若果等待的不是

    promise

    對象,則傳回該值本身
function resolveAfter2S(data){
    return new Promise((res)=>{
        setTimeout(()=>{
            res(data)    
        },2000);
    });
}
async function f1(){
    let x=await resolveAfter2S(10);
    let y=await 30;
    console.log(y);//30
    console.log(x);//10
}
f1()
複制代碼
           

繼續閱讀