JavaScript异步之Generator、async、await

140 阅读1分钟

Generator

Generator允许我们在函数执行过程中暂停,并在将来某一个时刻回复执行。改变例以往函数必须执行完成才返回的特点。 整个 Generator 函数就是一个封装的异步任务,或者说是异步任务的容器。异步操作需要暂停的地方,都用 yield 语句注明

function* example(){
    yield 1;
    yield 2;
    yield 3;
}
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(75);//给定返回值,并结束生成器{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()