问题描述
在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
时很有用。