Как избежать того, что асинхронная функция в качестве аргумента может привести к не отловленной ошибке
Асинхронная функция в качестве аргумента может привести к не отловленной ошибке.
Переделываю старый код на async-await и где-то использовал уже асинхронные функции в качестве аргумента при вызове другой функции.
То есть просто игнорировал то, что они вернут промис, который в данном случае просто не нужен (не важно когда завершится функция и что будет в нагрузке промиса).
Если в таких асинхронных функциях-аргументах случится ошибка, то она выскочит на самый верх и убьёт процесс в ноде. Или в браузере просто будет в консоли.
Вопрос:
Как избегать данных ситуаций средствами typescript, webstorm или чем-то ещё?
Нужно чтобы что-то мне во всём проекте подсветило данные места или не давало игнорировать возвращаемые промисы при использовании таких функций. Их очень легко принять за обычные и подложить себе мину. А так как уже много чего написал, то просто не реально уже найти все ситуации.
Пример кода:
async function myFunction(){
console.log('ура, типа как синхронная');
await new Promise(( _, reject )=>{
setTimeout( ()=>{
console.log('нате вам ошибочку! (см. в консоли браузера)');
reject( Error('some-error') );
}, 1500 );
});
}
setTimeout( myFunction, 0 ); // <--- Тут мне нужна какая-то подсветка или запрет оставлять без catch
Ищу что-то похожее на это:
Вот более-менее приемлемый вариант в вебшторме, но только для тела синхронных функций, а мне нужно для аргументов:
Ответы (1 шт):
Тут мне нужна какая-то подсветка или запрет оставлять без catch
- единственное что нашел - TSLint
no-floating-promises(не проверял)
Выглядит как узкоспециализированная хотелка - расширяем задачу: "подсветка асинхронных функций".
- Искал плагин для VSCode - не нашел. :(
TSLint no-floating-promises
- https://stackoverflow.com/a/47401561/4794368
- https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-floating-promises.md
а вообще
Как мне кажется, это должно решаться на уровне языка (типизированного). Если мы ждём на входе функцию (function f1(f: Function): {}) - она должна быть простой функцией а не промисом.
Так что для меня, эта ситуация выглядит как ?баг/кривизна TS.
песочница там
function foo(): void { }
async function fooAsync(): Promise<void> { }
T1: {
type $FooAsync = (...args: any[]) => Promise<void>
function f1(f: $FooAsync) { }
// @ts-expect-error
f1(foo) // как и ожидалось - ошибка
}
T2: {
function f1(f: Function): {}
// @ts-expect-error
f1(fooAsync) // нет ошибки
type $Function = (...args: any[]) => void
function f2(f: $Function) { }
// @ts-expect-error
f2(fooAsync) // нет ошибки
}
// @ts-expect-error - https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-9.html#-ts-expect-error-comments
P.S.
Кто смелый - может зайти в песочницу по ссылке и прямо оттуда создать баг репорт. Ну или хотя бы proposal.
