簡體   English   中英

TSLint-必須使用“ finally”適當地處理承諾

[英]TSLint - Promises must be handled appropriately with `finally`

我從TSLint收到此錯誤,並且試圖了解為什么它在抱怨。

我有一個函數,該函數調用另一個返回諾言的方法,但第一個函數不返回諾言,因為它只是等待其完成並更新內部狀態。

我將其簡化為此函數,僅使用Q()模擬返回承諾的調用。

export function DoSomethingAsync(): void {
    Q().then(r => {
        console.log('test');
    }).catch(err => {
        log.error("wow");
    }).finally(() => {
        log.info("at finally")
    });
}

現在在我的項目上運行tslint ,出現以下錯誤:

錯誤:C:/dev/local_cache_service.ts [31,5]:必須正確處理承諾

如果我刪除finally調用tslint通過沒有錯誤。

export function DoSomethingAsync(): void {
    Q().then(r => {
        console.log('test');
    }).catch(err => {
        log.error("wow");
    });
}

當我在種子打字稿項目上創建相同的功能時,此行為不會重現...

這是無浮動承諾規則的投訴。 根據其說明:

創建一個Promise而不存儲或返回它可能會使其他代碼獨立於其結果運行。 根據外部時序因素,這可能導致意外的和/或不確定的行為。

通常最好從啟動它們的函數中返回Promises,然后在調用代碼中對其進行處理。

除此規則外,還要使用no-unused-expression來顯示更多的浮動承諾。

具體來說,這是因為您正在.finally之后.catch塊中運行代碼。 規則認為這很危險,因為如果.finally的代碼.finally引發錯誤,則調用代碼將無法對其進行處理。

對您而言,最好的辦法是return諾言,因此該函數的返回類型為Promise / Q而不是void

提示:您可以運行tslint -t stylishtslint -t verbose來查看規則名稱及其投訴!

解決方案是在promise調用鏈的末尾添加對.done()的調用。

據我了解, done將所有未處理的異常轉換為常規未處理的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM