如何在 JavaScript 中的异步生成器函数中引发错误?

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方法,它们都会在异步生成器函数中引发任何错误。