Поскольку я недавно работаю над проектом Javascript, я хотел бы задокументировать некоторые хитрости об этом языке программирования, чтобы люди не попали в ту же раздражающую ситуацию. Если вы хотите увидеть полный код, посетите здесь.
Проблема: функция не блокировалась с помощью «ожидания»
Рассмотрим следующие фрагменты
После выполнения функции test(), поскольку вызываемой функции noPromiseWithTimeout предшествует ключевое слово await, ожидаемый результат может быть таким: Операторы console.log() функции noPromiseWithTimeout будут выполняться первыми, а затем, наконец, оператор журнала 'done'. Тем не менее, вы получите результат
Почему это так?? Похоже, функция noPromiseWithTimeout вообще не ждала!!
Что ж, давайте сначала вернемся к документации по асинхронным функциям, она гласит:
Асинхронная функция — это функция, которая работает асинхронно через цикл событий, используя неявный
Promise
для возврата своего результата.
Возвращаясь к определению тестовых функций, на самом деле не объявлены какие-либо операторы возврата... Это просто означает, что возвращаемый объект Promise де-факто является неопределенным, и, таким образом, возник неожиданный результат (хотя код не слетел). Такое поведение будет особенно раздражать всякий раз, когда вы пытаетесь выполнить синхронизированный вызов нескольких асинхронных функций в одном и том же блоке кода.
Решение: вернуть явно объявленный объект Promise
Чтобы решить вышеуказанную проблему, нам нужно явно вернуть объект Promise вызывающей функции. Фрагмент кода выглядит следующим образом.
Возвращая этот объект Promise, вызывающая функция, т. е. test() в данном случае, будет блокировать выполнение до тех пор, пока этот объект Promise либо не будет выполнен, либо отклонен, и в конечном итоге мы сможем обеспечить синхронный поток выполнения.
Есть и другие второстепенные варианты использования, которые включены в исходный код. Если вы хотите узнать больше, посетите здесь.
Спасибо за чтение этой статьи!