如何在异步生成器函数中抛出错误
How to throw an error in an async generator function
在 Javascript 中的一个异步生成器函数中,它是一个转换函数,第一个参数本身就是一个异步生成器函数。
在函数中有一个转换和一个检查。如果检查是假的,生成器函数应该被中止。如果检查正确,则应得出结果。我用随机数模拟了错误。
我找到了三种抛出错误的方法:
- return Promise.reject(新错误("一些消息"));
- 抛出新错误(“一些消息。”);
- yield Promise.reject(new Error("Some Message"));
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;
}
}
所有人的结果都是一样的。我想知道区别在哪里,使用流作为源参数时是否存在泄漏,因为它们是兼容的。
是的,它们都是一样的。没有泄漏,它们都关闭了 source
迭代器(在其上调用 .return()
)。
您应该使用简单的 throw new Error(…);
自己明确地抛出错误,其他形式在您调用 promise-returning 函数和 .
时很有用
无论你在for..of
循环中throw
还是return
,迭代器都会关闭(无论是同步还是异步)[spec]。
从概念上讲,异步生成器进一步执行的结果表示为一个Promise,return和yield就像一个决议,throwing就像一个拒绝。现在用另一个 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 中的一个异步生成器函数中,它是一个转换函数,第一个参数本身就是一个异步生成器函数。 在函数中有一个转换和一个检查。如果检查是假的,生成器函数应该被中止。如果检查正确,则应得出结果。我用随机数模拟了错误。
我找到了三种抛出错误的方法:
- return Promise.reject(新错误("一些消息"));
- 抛出新错误(“一些消息。”);
- yield Promise.reject(new Error("Some Message"));
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;
}
}
所有人的结果都是一样的。我想知道区别在哪里,使用流作为源参数时是否存在泄漏,因为它们是兼容的。
是的,它们都是一样的。没有泄漏,它们都关闭了 source
迭代器(在其上调用 .return()
)。
您应该使用简单的 throw new Error(…);
自己明确地抛出错误,其他形式在您调用 promise-returning 函数和
无论你在for..of
循环中throw
还是return
,迭代器都会关闭(无论是同步还是异步)[spec]。
从概念上讲,异步生成器进一步执行的结果表示为一个Promise,return和yield就像一个决议,throwing就像一个拒绝。现在用另一个 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")));