2017-05-15 44 views
6

我在TypeScript中使用async/await進行一些基本的異步操作,但是TSLint正在爲以下兩個函數拋出神祕的錯誤消息。有沒有人遇到過這些錯誤?在錯誤輸出中,沒有提到控制規則,所以我不明白是什麼導致了這些。任何想法將不勝感激。這可能是關於什麼? [TsLint錯誤:「必須正確處理承諾」]

主要請求:

import * as rp from 'request-promise' 

export function getRequest(address: rp.Options): rp.RequestPromise { 
    return rp(address) 
} 

導出異步函數:

export async function getStatus(message: Message) { 
    try { 
    const res = await getRequest(address) 
    if (res.ready) { 
     message.reply('...') 
    } else { 
     message.reply('...') 
    } 
    } catch (err) { 
    message.reply(err) 
    } 
} 

這得到:Promises must be handled appropriatelyawait of non-Promise 3#線。

使用該出口的簡單的功能是:

client.on('message', message => { 
    if (message.content === 'green') { 
    getStatus(message) 
    } 
}) 

這也得到Promises must be handled appropriately

其他信息:

即使錯誤消息並沒有提到它,這似乎是Promises must be handled appropriately理事規則: https://palantir.github.io/tslint/rules/no-floating-promises/

而這個問題提到await of non-Promisehttps://github.com/palantir/tslint/issues/2661

+3

你也可以在問題中發佈getRequest函數,謝謝。 – Rikusor

+0

好點,我添加了它。 – cinnaroll45

+0

只是在這裏猜測,但這可能是tslint不承認rp函數返回一個承諾。你可以嘗試爲它設置一個類型,導出函數getRequest(地址:rp.Options):Promise {...讓我知道如果這個工程,所以我不花更多的時間檢查這個:) – Rikusor

回答

3

您的getStatus函數被定義爲返回一個承諾:

// All functions marked as async returns a promise: 
async function getStatus(message: Message) {/* ... */} 

但是你叫getStatus沒有調用它,那麼:

getStatus(message) 

因此編譯器認爲你忘了處理您的異步代碼。所有你需要做的就是調用.then()

getStatus(message).then(() => console.log('done')); 
+0

你是對的,但是這行'getStatus(message).then(()=> console.log('done'))'仍然得到'Promises必須得到適當的處理。 – cinnaroll45

+0

@ cinnaroll45你是否嘗試處理'.catch()'? 'getStatus()。then()。catch()' – slebetman

+0

是的,試過bot'.catch()'和'try/catch'來調用'getStatus()'仍然和我的第一條評論一樣。 – cinnaroll45

1

我覺得這個問題是由等待功能的getStatus,因爲它的異步功能可以解決。消息說得很清楚,但行號會造成混淆。說實話,這也花了我一些時間。

您可以通過這個代碼變化解決這個皮棉錯誤:

client.on('message', message => { 
if (message.content === 'green') { 
    await getStatus(message) 
}}); 

在我看來這不是一個好主意,切換這些特定的錯誤了。它們非常有用,因爲在另一方面,您不會運行代碼異步。

1

我已經得到了同樣的異常時,我已經使用firebase-tool

const ref = admin.database().ref("path/to/database/object"); 

ref.once("value").catch(error =>{ // line 22 
    response.send(error()); 
}).then(snapshot =>{ 
    response.send(snapshot.val); 
}) 

此代碼沒有按不編譯和return

ERROR: /src/index.ts[22, 5]: Promises must be handled appropriately 

我已經改變了catchthen地方創建firebase-function

ref.once(...).then(...).catch(...) 

此代碼的工作,我很抱歉,但我沒有任何解釋

這麼多驚人的,當應用程序返回的一些錯誤,而不catch塊甚至可以根據firebase doc沒有提到catch是必需的。

+0

原因是每一個承諾都必須結束。 –

0

這是一個糟糕的錯誤消息。一個更好的一個可能是,

Promise類型的每個表達式必須與到.catch呼叫或拒絕處理程序.then呼叫結束(來源:source)。

因此,舉例來說,如果你做

PromiseFunction() 
    .catch(err => handle(err)) 
    .then(() => console.log('this will succeed')) 

,那麼你將仍然有tslint問題,因爲.then(...)類型是一種承諾,它有一個抓結束。此修復程序將被追加.catch,如,

PromiseFunction() 
    .catch(err => handle(err)) 
    .then(() => console.log('this will succeed')) 
    .catch(() => 'obligatory catch') 

或只是通過禁用tslint該行:

PromiseFunction() 
    .catch(err => handle(err)) 
    // tslint:disable-next-line:no-unsafe-any 
    .then(() => console.log('this will succeed')) 

你也可以扭轉.then.catch的語句的順序,但如果發生錯誤,您可能會想要停止執行.then