Статический / динамический c способ обнаружения оборванных обещаний - PullRequest
2 голосов
/ 24 апреля 2020

Я знаю, что эта проблема была решена с столько раз , но ни одна из них, похоже, не решает проблему надежного обнаружения висящих обещаний (даже тех, которые что решить правильно).

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

1 Ответ

0 голосов
/ 25 апреля 2020
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...