TypeScriptでasync/await
を使用していくつかの基本的な非同期操作を行っていますが、TSLintは以下の2つの関数に対して不可解なエラーメッセージを投げています。誰もこれらのエラーに遭遇したことがありますか?エラー出力には管理規則が記載されていないため、これらの原因はわかりません。どんなアイデアでも大歓迎です。
主なリクエスト:
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)
}
}
これは、3行目のPromises must be handled appropriately
とawait of non-Promise
を取得します。
このエクスポートを使用する単純な関数は次のとおりです。
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-Promise
に言及しています: https://github.com/palantir/tslint/issues/2661
それは安っぽいエラーメッセージです。より良いものは、
タイプPromise
のすべての式は、.catch
への呼び出しまたは拒否ハンドラーによる.then
への呼び出しで終了する必要があります( ソース )。
だから、例えば、あなたが
PromiseFunction()
.catch(err => handle(err))
.then(() => console.log('this will succeed'))
.then(...)
の型は約束であり、キャッチで終了する必要があるため、tslintの問題が引き続き発生します。修正は.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
の実行が停止します。この問題が発生した場合は、おそらくこれが必要です。
時々、promiseを呼び出したいかもしれませんが、応答で何もする必要はありません。ルートの変更など。
代わりに:
promiseFunction().then().catch()
try/catch async/await
できるよ:
void promiseFunction();
getStatus
関数は、promiseを返すように定義されています。
// All functions marked as async returns a promise:
async function getStatus(message: Message) {/* ... */}
しかし、getStatus
を呼び出すことなく呼び出した場合は、次のようになります。
getStatus(message)
したがって、コンパイラは、非同期コードを処理するのを忘れたと判断します。必要なのは、.then()
を呼び出すことだけです。
getStatus(message).then(() => console.log('done'));
firebase-function
を使用して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
catch
とthen
の場所を変更しました。
ref.once(...).then(...).catch(...)
このコードは機能しています。申し訳ありませんが、説明はありません
アプリがfirebase doc
によるとcatch
ブロックがなくてもcatch
が必要であると言及されていなくてもエラーを返すとき、非常に驚くべきことです。
この問題は解決可能だと思いますgetStatus関数を待つことで、非同期関数なので。メッセージははっきりと言っていますが、行番号が混乱を引き起こしています。正直に言うと、時間がかかりました。
このコードの変更により、このlintエラーを解決できます。
client.on('message', message => {
if (message.content === 'green') {
await getStatus(message)
}});
私の意見では、これらの特定のエラーをオフにするのは得策ではありません。他の方法ではコードの非同期を実行しないため、これらは便利です。