[英]How to throw an error in an async generator function
在 Javascript 中的異步生成器函數(旨在用作轉換函數)中,第一個參數本身就是一個異步生成器函數。 在函數內有一個轉換和一個檢查。 如果檢查為假,則生成器功能應中止。 如果檢查正確,則應產生結果。 我已經用隨機數模擬了錯誤。
我找到了三種拋出錯誤的方法:
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.