[英]Firebase functions tslint error Promises must be handled appropriately
[英]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 stylish
或tslint -t verbose
來查看規則名稱及其投訴!
解決方案是在promise調用鏈的末尾添加對.done()
的調用。
據我了解, done
將所有未處理的異常轉換為常規未處理的異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.