Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Вопрос про Promise.then

☢▴▲▴☢ Мастер (2160), на голосовании 6 месяцев назад
Дано:
извне несколько раз вызывается синхронная функция (допустим, onGetExternalData), в которую передается UInt8Array, который представляет из себя часть бинарного файла. Части файла передаются по порядку, т.е. первый вызов onGetExternalData - первая часть файла, второй - вторая, и т.д.
Внутри этой синхронной функции onGetExternalData вызывается асинхронная функция, которая декодирует формат файла и выдает UInt8Array уже в декодированном виде.
Нужно:
обеспечить сохранение декодированных UInt8Array в правильном порядке, чтобы ничего не перепуталось из-за асинхронности функции, вызываемой из onGetExternalData.

Предполагаемая реализация:
При первом вызове onGetExternalData сохранить Promise, который вернет асинхронная функция декодирования (допустим, в переменной decodePromise).
При последующих вызовах, вызывать из этого Promise метод then, и передавать в него асинхронную функцию декодирования. Результат вызова then перезаписывать в decodePromise, чтобы каждый последующий then вызывался из Promise, возвращенного предыдущим.

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

Then можно вызывать сколько угодно раз - а будут ли при этом функции, переданные в then, выполняться в том же порядке, в котором был вызван then?
Максим Искусственный Интеллект (213208) ☢▴▲▴☢, асинхронная функция это не всегда await. Я тут особо не разбирался, что там требуется сделать, я лишь прокомментировал ситуацию. Если функция вызывает асинхронную функцию и ей нужен результат работы этой асинхронной функции, то она тоже должна стать асинхронной. При этом использовать await, Promise или then, роли не играет. Если она не асинхронная, тогда она может что-то запустить, но не будет этого ожидать. По поводу then и их последовательности. then создают микрозадачи, которые выполняются в последовательности их появления, то есть в том порядке, в котором вызывался then.
Похожие вопросы