generator

  • generator(生成器),整个Generator函数就是一个异步任务的容器,在需要暂停的位置使用yield语句
  • 基本语法以及使用
function * show() {
   
    yield '1';
    yield '2';
    return '3';
}
let a = show();
//a.next() //{value: "1", done: false}
//a.next() //{value: "2", done: false}
//a.next() //{value: "3", done: true}

当执行到return时done为true

  • 使用for of可以自动遍历 generator,但是return后面的不会遍历
function * show(){
   
    yield '1';
    yield '2';
    return '3';
}
let a = show();
for(let val of a){
   
    console.log(val);
}
//1
//2
  • 对generator函数也可以使用解构
function * show(){
   
    yield '1';
    yield '2';
    yield '4'
    return '3';
}
let [a,...b] = show();
console.log(a,b);//1 [2,4]

async

async写在函数前面表示这个函数是异步的

  • async特点:
    1.相比generator语义化更强
    2.await后面可以是promise对象,也可以数字、字符串、布尔
    3.async函数返回是一个promise对象
    4.只要await语句后面Promise状态变成 reject, 那么整个async函数会中断执行
  • 基本语法
async function fn() {
   
    let result = await ...
}
  • async函数返回一个Promise对象,async函数中return返回的值可以成为then方法回调的值
async function fn(){
   
    return 'welcome';
}

fn().then(res=>{
   
    console.log(res);//welcome
})
  • async函数抛出的错误,catch方法额参数会接收这个错误
async function fn(){
   
    throw new Error('Error出错了');
}

fn().then(res=>{
   
    console.log(res);
}).catch(err=>{
   
    console.log(err);//打印错误信息
})
  • await后面的Promise对象状态为rejected会终止,函数里后面的代码不会运行
async function fn(){
   
    await Promise.reject('出现问题了');
    let a = await Promise.resolve('success');
    console.log(a);
}

fn().then(res=>{
   
    console.log(res);
}).catch(err=>{
   
    console.log(err);
})
//出现问题了

解决出错问题的方法

//在await后面的Promise对象后面通过catch的参数接收错误
async function fn(){
   
    await Promise.reject('出现问题了').catch(err=>{
   
        console.log(err);
    });
            
    let a = await Promise.resolve('success');
    console.log(a);
}

fn().then(res=>{
   
    console.log(res);
});