1. 什么是异步生成器函数?
异步生成器是一种函数,可以通过将其声明为异步函数并使用yield
关键字将多个结果返回给调用方。与普通生成器不同的是,异步生成器可以暂停等待异步操作完成后再继续执行。
async function* asyncGenerator() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
const gen = asyncGenerator();
gen.next().then(result => console.log(result)); // { value: 1, done: false }
2. 在异步生成器函数中引发错误的方法
2.1 使用throw方法
可以使用throw
方法在异步生成器函数中引发错误,类似于在同步生成器函数中使用throw
关键字。调用throw
方法时,会抛出一个异常,可以用try/catch语句捕获并处理它。
async function* asyncGenerator() {
try {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
} catch (e) {
console.error('Error:', e);
}
}
const gen = asyncGenerator();
gen.next().then(result => console.log(result)); // { value: 1, done: false }
gen.throw(new Error('Something went wrong')); // Error: Something went wrong
注意:如果未捕获异常,它将向外部传递并终止执行。
2.2 使用return方法
使用return
方法可以结束生成器函数并返回一个指定的值。在异步生成器函数中,return
方法也可以在任何时候使用,并且当前的yield
状态(如果存在)将被忽略。
async function* asyncGenerator() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
}
const gen = asyncGenerator();
gen.next().then(result => console.log(result)); // { value: 1, done: false }
gen.return('Done').then(result => console.log(result)); // { value: 'Done', done: true }
2.3 在异步操作期间引发错误
在异步生成器函数中进行异步操作时,可以在其中引发错误。如下面的代码中所示:
async function* asyncGenerator() {
try {
yield await new Promise(resolve => setTimeout(resolve, 1000));
yield await fetch('http://localhost:3000/data');
yield await new Promise((resolve, reject) => setTimeout(reject, 1000, new Error('Timeout')));
} catch (e) {
console.error('Error:', e);
}
}
const gen = asyncGenerator();
gen.next().then(result => console.log(result)); // { value: undefined, done: false }
在上面的代码中,异步操作分别是使用setTimeout
模拟的等待1秒,使用fetch
方法异步获取数据以及再次使用setTimeout
模拟的1秒超时。由于操作是异步执行的,因此它们的结果不会立即可用。
在这种情况下,如果在异步发生错误时不使用try/catch语句正确处理它们,则将不会引发任何错误,而是继续返回{value:undefined, done:false}
。
结论:
如果您正在使用异步生成器函数进行异步操作,请使用try/catch语句包装代码并正确引发错误。无论是在promise已拒绝的情况下调用throw
方法,还是在yield
状态未充分考虑任何先前的状态的情况下调用return
方法,它们都会在异步生成器函数中引发任何错误。