Я знаю, что эта проблема была решена с столько раз , но ни одна из них, похоже, не решает проблему надежного обнаружения висящих обещаний (даже тех, которые что решить правильно).
Итак, я хочу иметь возможность найти способ (будь то во время выполнения или лучше во время c времени), чтобы root из "свисающих обещаний", особенно этого класса:
async function a() {
... do some async operation ...
}
async function b() {
a(); // forgot to call await on it
}
, где я случайно забыл дождаться выполнения одной функции, а некоторые задачи, которые выполняются асинхронно, не ожидаются. Часто такие ошибки не вызывают исключений, поэтому я не могу просто использовать «unhandledRejection» и называть это днем.
В этот момент, после множества отчаянных попыток, мне просто нужен способ обнаружить этот неисправный шаблон во время (оптимально) статического / компиляции / lint времени или во время выполнения. Время выполнения для меня, я думаю, должно работать при условии, что у меня хорошее покрытие тестами.
tl; dr в основном, я ищу какой-то код, который будет делать что-то вроде следующего:
Error: Potential dangling promise detected!
...
at b (/dangling.js:5:3)
Для каждое свисающее обещание
Мой мыслительный процесс
Сначала я попытался найти некоторую библиотеку анализа stati c, которая помогла бы обнаружить эти вещи (теоретически это должно быть возможно, но мне не повезло с поиском такого вещь). Некоторое время назад я помню, что нашел что-то в глубине стека overoverflow, в котором говорилось об использовании некоторой проверки машинописи для проверки оборванных обещаний, хотя теперь я больше не могу ее найти :(. Хотя в то время изменение всей кодовой базы на машинопись было нет - go. (Позже я узнал, что вы можете на самом деле используйте ts c для проверки типов javascript (учитывая, что вы делаете некоторую аннотацию типа в комментариях))
В настоящее время я ранее использовал узел версии 11, поэтому я подумал об использовании node.js async_hooks API и попытался прослушивать события (очевидно, простое исправление обезьяны в конструкторе Promise не сработает, потому что node.js обходит конструктор Promise при создании объекта Promise для возврата из асинхронной c функции.) Используя узел v11, после небольшого количества хакерских кодов здесь кажется, что это работает (хотя это не очень эффективная причина он отбрасывает много оптимизма обещаний в двигателе v8, но это делает работу.) В этом был небольшой сбой вся операция в том, что мне все еще приходилось исправлять функции then / catch / finally API Promise, чтобы проверить, вызываем ли мы эту функцию в настоящий момент (каким-то образом это помогло обнаружить некоторые висячие обещания).
Теперь введите узел v12 (очевидно, мне нужно это для некоторых других вещей, которые ломаются), и теперь эта хакерская (неудивительно) полностью ломается. После тщательного изучения версии diff похоже, что они оптимизировали реализацию await / asyn c . После сужения причины, похоже, что await больше не вызывает функцию then
обещания, а просто напрямую выполняет некоторые нативные махинации (вот что на самом деле).
Теперь я действительно отчаянно нуждаюсь в каком-то решении (и, может быть, если в Typescript есть какой-то способ проверки типов этих висячих обещаний, какой был вариант, чтобы включить эту проверку? Я знаю (проверено), что ts c не делает этого по умолчанию).