javascript - 如何在异步生成器函数中引发错误

标签 javascript typescript asynchronous error-handling yield

在Javascript旨在用作转换函数的异步生成器函数中,第一个参数本身就是异步生成器函数。
函数中有一个转换和一个检查。如果检查错误,则应中止生成器功能。如果检查正确,则应得出结果。我已经用随机模拟了错误。
我发现了三种抛出错误的方法:

  • 返回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;
        }
    }
    
    所有结果都是相同的。我想知道区别在哪里,并且在使用流作为源参数时是否存在泄漏,因为它们是兼容的。

    最佳答案

    无论您在throw循环中使用return还是for..of,迭代器都将被关闭(无论是同步还是异步)[spec]
    从概念上讲,进一步执行异步生成器的结果表示为Promise,返回和yield就像是解决方案,而throw就像是拒绝。现在用另一个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 - 如何在异步生成器函数中引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63809555/

    相关文章:

    typescript - 解构歧视联盟

    javascript - 加载图表后如何获取 Google Visualization DataTable 数据?

    javascript - 异步函数作为 knockout 绑定(bind)目标

    javascript - WebGL 仅渲染/加载某些 PNG 文件

    angularjs - 带有 typescript Controller 的 Angular

    javascript - 如何有效地创建 100 个切换图像按钮?

    javascript - Angular 6 - 如何定义不止一种类型的返回值类型

    c# - 如何在进程停止时取消虚拟主机

    javascript - jquery autocomplete 如何设置标签以及如何获取值?

    javascript - div之间的空间很小