繁体   English   中英

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

[英]How to throw an error in an async generator function

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

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

  • return Promise.reject(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;
    }
}

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

无论您是在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM