Максим
Искусственный Интеллект
(213208)
7 месяцев назад
Если какая-то синхронная функция вызывает асинхронную функцию, от результатов которой она зависит, тогда эта синхронная функция тоже становится асинхронной (ну или должна ею стать).
По поводу вопроса. Если промис выполнен, то на нём можно вызывать then сколько угодно раз.
☢▴▲▴☢Мастер (2160)
7 месяцев назад
Не совсем.
Синхронная функция вызывает асинхронную без await. Из-за ограничений библиотеки, асинхронной - прямо с ключевым словом async - стать она не может.
Then можно вызывать сколько угодно раз - а будут ли при этом функции, переданные в then, выполняться в том же порядке, в котором был вызван then?
извне несколько раз вызывается синхронная функция (допустим, onGetExternalData), в которую передается UInt8Array, который представляет из себя часть бинарного файла. Части файла передаются по порядку, т.е. первый вызов onGetExternalData - первая часть файла, второй - вторая, и т.д.
Внутри этой синхронной функции onGetExternalData вызывается асинхронная функция, которая декодирует формат файла и выдает UInt8Array уже в декодированном виде.
Нужно:
обеспечить сохранение декодированных UInt8Array в правильном порядке, чтобы ничего не перепуталось из-за асинхронности функции, вызываемой из onGetExternalData.
Предполагаемая реализация:
При первом вызове onGetExternalData сохранить Promise, который вернет асинхронная функция декодирования (допустим, в переменной decodePromise).
При последующих вызовах, вызывать из этого Promise метод then, и передавать в него асинхронную функцию декодирования. Результат вызова then перезаписывать в decodePromise, чтобы каждый последующий then вызывался из Promise, возвращенного предыдущим.
Вопрос: верен ли выбранный подход для обеспечения правильного порядка выполнения асинхронных функций?
Не будет ли проблем, если к моменту вызова then из Promise, он будет уже в статусе fullfilled?