Что это может быть? [TsLint Error: "Promises должно быть обработано соответствующим образом" ]

Я выполняю некоторые основные асинхронные операции, используя async/await в TypeScript, но TSLint бросает таинственные сообщения об ошибках для этих двух функций ниже. Кто-нибудь сталкивался с этими ошибками раньше? На выходе ошибки правило управления не упоминается, поэтому я не понимаю, что их вызывает. Любые идеи были бы с благодарностью.

Основной запрос:

import * as rp from 'request-promise'

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

Экспортированная функция async:

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 appropriately и await 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-Promise: https://github.com/palantir/tslint/issues/2661

Ответ 1

Это дерьмовое сообщение об ошибке. Лучше может быть,

каждое выражение типа Promise должно заканчиваться вызовом .catch или вызовом .then обработчиком отклонения (источником).

Так, например, если вы делаете

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 при возникновении ошибки, которую вы, вероятно, захотите, если столкнулись с этой проблемой.

Ответ 2

Иногда вы можете захотеть вызвать обещание, но вам не нужно ничего делать с ответом. Изменение маршрута или что-то еще.

так что вместо:

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

ты можешь сделать:

void promiseFunction();

Ответ 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'));

Ответ 4

Я думаю, что эта проблема исправлена ​​ , ожидая функцию getStatus, так как она имеет асинхронную функцию. В сообщении ясно сказано, но номер строки вызывает путаницу. Честно говоря, это также заняло у меня некоторое время.

Вы можете решить эту ошибку lint этим изменением кода:

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

По-моему, не рекомендуется отключать эти конкретные ошибки. Они полезны, потому что иначе вы не запускаете асинхронный код.

Ответ 5

У меня такое же исключение, когда я создал 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(...)

Этот код работает, извините, но у меня нет объяснений

Настолько удивительно, что приложение возвращает некоторую ошибку без блока catch даже в соответствии с firebase doc, не упомянув, что требуется catch.