web-dev-qa-db-ja.com

これはどういうことでしょうか? [TsLintエラー:「約束を適切に処理する必要があります」]

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 appropriatelyawait 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

36
cinnaroll45

それは安っぽいエラーメッセージです。より良いものは、

タイプ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の実行が停止します。この問題が発生した場合は、おそらくこれが必要です。

66

時々、promiseを呼び出したいかもしれませんが、応答で何もする必要はありません。ルートの変更など。

代わりに:

promiseFunction().then().catch()
try/catch async/await

できるよ:

void promiseFunction();
20
T04435

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'));
4
slebetman

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

catchthenの場所を変更しました。

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

このコードは機能しています。申し訳ありませんが、説明はありません

アプリがfirebase docによるとcatchブロックがなくてもcatchが必要であると言及されていなくてもエラーを返すとき、非常に驚​​くべきことです。

3
Vahe Gharibyan

この問題は解決可能だと思いますgetStatus関数を待つことで、非同期関数なので。メッセージははっきりと言っていますが、行番号が混乱を引き起こしています。正直に言うと、時間がかかりました。

このコードの変更により、このlintエラーを解決できます。

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

私の意見では、これらの特定のエラーをオフにするのは得策ではありません。他の方法ではコードの非同期を実行しないため、これらは便利です。

1
Crix