在Javascript旨在用作转换函数的异步生成器函数中,第一个参数本身就是异步生成器函数。
函数中有一个转换和一个检查。如果检查错误,则应中止生成器功能。如果检查正确,则应得出结果。我已经用随机模拟了错误。
我发现了三种抛出错误的方法:
export async function* transformAsync<T>(
source: AsyncGenerator<T, void, unknown>,
) {
for await (const line of source) {
const transformedLine = transformWithSomeMagic(line);
if(Math.random() > 0.8) {
return Promise.reject(new Error("Some Message"));
// OR
throw new Error("Some Message.");
// OR
yield Promise.reject(new Error("Some Message"));
}
yield transformedLine;
}
}
所有结果都是相同的。我想知道区别在哪里,并且在使用流作为源参数时是否存在泄漏,因为它们是兼容的。
最佳答案
无论您在throw
循环中使用return
还是for..of
,迭代器都将被关闭(无论是同步还是异步)[spec]。
从概念上讲,进一步执行异步生成器的结果表示为Promise,返回和yield就像是解决方案,而throw就像是拒绝。现在用另一个Promise解决一个Promise将会“扁平化”它,因此Promise.reject
包装器是多余的。 [spec]
return Promise.reject(new Error("Some Message"));
// barely equals
resolve(Promise.reject(new Error("Some Message"))
throw new Error("Some Message.");
// barely equals
reject(new Error("Some Message."));
yield Promise.reject(new Error("Some Message"));
// this one's more complicated, but it also barely equals
resolve(Promise.reject(new Error("Some Message")));
关于javascript - 如何在异步生成器函数中引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63809555/