[英]How to throw an error in an async generator function
在 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;
}
}
结果对所有人来说都是相同的。 我想知道区别在哪里以及使用流作为源参数时是否存在泄漏,因为它们是兼容的。
无论您是在for..of
循环中throw
还是return
,迭代器都将关闭(无论是同步还是异步) [spec] 。
从概念上讲,异步生成器进一步执行的结果被表示为一个 Promise,返回和让步就像一个决议,而抛出就像一个拒绝。 现在用另一个 Promise 解析一个 Promise 将“扁平化”它,因此Promise.reject
包装器是多余的。 [规格]
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")));
是的,它们都是相同的。 没有泄漏,它们都关闭了source
迭代器(在其上调用.return()
)。
你应该使用简单的throw new Error(…);
对于自己显式抛出错误,当您调用 promise 返回函数并与隐式await
一起工作时,其他形式很有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.