【问题标题】:How to throw an error in an async generator function如何在异步生成器函数中抛出错误
【发布时间】:2020-12-27 18:18:58
【问题描述】:

在 Javascript 中的异步生成器函数中,它旨在用作转换函数,第一个参数本身就是一个异步生成器函数。 在函数中有一个转换和一个检查。如果检查是假的,则应该中止生成器函数。如果检查是正确的,则应该产生结果。我已经用随机数模拟了错误。

我找到了三种抛出错误的方法:

  • return Promise.reject(new Error("Some Message"));
  • throw new Error("Some Message.");
  • 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;
    }
}

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

【问题讨论】:

    标签: javascript typescript asynchronous error-handling yield


    【解决方案1】:

    无论你是throw 还是returnfor..of 循环中,迭代器都将关闭(无论是同步还是异步)[spec]

    从概念上讲,异步生成器进一步执行的结果表示为 Promise,返回和屈服就像一个决议,而抛出就像一个拒绝。现在用另一个 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")));
    

    【讨论】:

      【解决方案2】:

      是的,它们都是相同的。没有泄漏,它们都关闭了source 迭代器(在上面调用.return())。

      您应该使用简单的throw new Error(…); 来显式地自己抛出错误,其他形式在您调用promise-returning 函数和work as with an implicit await 时很有用。

      【讨论】:

        猜你喜欢
        • 2017-12-06
        • 1970-01-01
        • 2020-07-24
        • 2017-10-23
        • 2023-02-08
        • 2019-09-05
        • 2017-08-13
        • 1970-01-01
        • 2017-12-06
        相关资源
        最近更新 更多