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);
});