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

问题描述

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

我发现了三种抛出错误方法

  • 返回Promise.reject(new Error(“ Some Message”));
  • 引发新的错误(“某些消息”。);
  • 收益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")));
,

是的,它们都是相同的。没有泄漏,所有泄漏都会关闭import re f = open('textfile.txt','r') #new output file new_csv = open('output.csv' 'w') text = f.read() ks = text.split('\n')[0] ve = text.split('\n')[1] keys = re.findall(r"'(.+?)'",str(ks)) values = re.findall(r"'(.+?)'",str(ve)) for key,value in zip(keys,values): new_csv.write(key+','+value+'\n') new_csv.close() 迭代器(在其上调用source)。

您应该使用简单的.return()来显式地引发错误,而其他形式在调用promise-returning函数和work as with an implicit await时很有用。