如何在异步生成器函数中抛出错误

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;
    }
}

所有人的结果都是一样的。我想知道区别在哪里,使用流作为源参数时是否存在泄漏,因为它们是兼容的。

是的,它们都是一样的。没有泄漏,它们都关闭了 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")));