簡體   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