Что это может быть? [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
.