|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
||||||
Promise: а где асинхронность?18.04.2019, 15:30. Показов 5168. Ответов 14
Метки нет (Все метки)
Привет!
Согласно https://developer.mozilla.org/... s/Promise: Объект Promise (обещание) используется для отложенных и асинхронных вычислений. Promise может находиться в трёх состояниях Выполняю такой код:
start: 1555590386022 promise start 1555590386022 promise finish 1555590388627 end: 1555590388627 Вопрос: а где тут асинхронность?
1
|
||||||
| 18.04.2019, 15:30 | |
|
Ответы с готовыми решениями:
14
Выход из Promise Uncaught (in promise) DOMException Audio Асинхронность javascript |
|
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
|
||||||
| 18.04.2019, 16:35 | ||||||
|
Всё потому, что в ваш промис передана функция, не содержащая вообще никакого асинхронного кода. А значит использование промиса в данном случае попросту бессмысленно.
Добавим немного асинхронности:
Более того в вашем коде вы не разрешаете промис вызовом функций resolve() или reject(), а значит обработка никогда не дойдёт до обработчика внутри promise.then()
1
|
||||||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
| 18.04.2019, 16:43 [ТС] | |
|
Balanaar, а зачем же тогда в принципе использовать Promise, если код у нас до него был асинхронный? Для лучшей читаемости?
0
|
|
|
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
|
||||||
| 18.04.2019, 16:56 | ||||||
|
Всё просто.
При программировании на JS вы можете столкнуться с какими-либо асинхронными функциями. Вам нужно выполнить их, получить результат и только потом работать с полученным результатом. Например, вы осуществляете AJAX-запрос на сервер. Для того, чтобы он выполнился, нужно некоторое время: сформировать запрос, отправить запрос, обработать на сервере и получить ответ. Нельзя сказать наверняка, сколько времени это займёт. В теории можно отправить синхронный запрос на сервер и остановить исполнение скрипта, пока мы не дождёмся ответа, но это не есть хорошо, потому что на время исполнения запроса страница подвиснет. Сымитируем AJAX-запрос на сервер с помощью асинхронной функции setTimeout(). В качестве времени задержки мы передадим случайное число от 1 до 5 секунд. Мы не знаем, сколько по времени будет отрабатывать setTimeout(), поэтому используем промис, чтобы работать с результатом сразу после получения ответа:
1
|
||||||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
||||||
| 18.04.2019, 17:09 [ТС] | ||||||
|
Balanaar, я не могу понять почему просто не сделать так:
0
|
||||||
|
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
|
|
| 18.04.2019, 17:15 | |
|
V0fka, можно и так. Только это то, что называется
callback hell (дословно: ад обратных вызовов).В более-менее сложных проектах можно столкнуться с чередой асинхронных функций. В таком случае придётся вкладывать каждую следующую функцию в коллбек предыдущей и получить уровень вложенности до 100 и даже больше. Промисы решают эту проблему. К тому же это удобный инструмент для отлова ошибок благодаря состоянию rejected промиса.
1
|
|
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
| 18.04.2019, 17:26 [ТС] | |
|
Balanaar, ну то есть это не что-то новое по своей природе (я думал, что это штука, которая асинхронно выполняет синхронный код), а просто, так сказать "синтаксический сахар", созданный для удобства разработки?
0
|
|
|
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
|
|||||||||||||
| 18.04.2019, 17:46 | |||||||||||||
Сообщение было отмечено V0fka как решение
Решение
Ещё одна удобная фишка промисов - это отслеживание множества асинхронных функций и выполнение кода только после исполнения их всех. Например, вам нужно выполнить какую-нибудь обработку только после того, как вы загрузили 50 изображений:
Добавлено через 16 минут
1
|
|||||||||||||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
| 18.04.2019, 17:47 [ТС] | |
|
Balanaar, ясно, спасибо за ответы!
0
|
|
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|||||||||||
| 18.04.2019, 20:42 | |||||||||||
Сообщение было отмечено amr-now как решение
Решение
V0fka, ответ на Ваш вопрос:
В скрипте была ошибка. Промис никогда не получал статус завершенного. Поэтому метод then() никогда не выполнялся. А в данном скрипте именно then() выполняется асинхронно. Вот правильный скрипт для технологии then() :
----- Хотя да. По логике настоящей асинхронности инструкция console.log("end: " + new Date().getTime()); должна была выполниться сразу же после старта.Имхо, такая мелкая особенность реализации в JavaScript. Добавлено через 2 минуты Видимо, пока с then() скрипт ковырялся, он решил, что можно и "рабочий код" промиса запустить ![]() Добавлено через 6 минут -------- Вот логически более корректный вызов "рабочего кода", где callback - "рабочий код":
1
|
|||||||||||
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
|||
| 20.04.2019, 17:47 | |||
Сообщение было отмечено amr-now как решение
Решение
Несколько источников в интернете сообщили, что согласно спецификации функция обратного вызова выполняется в конструкторе синхронно, то есть без ожидания.
https://www.ecma-international... onstructor
Да. Это особенность реализации промисов в JavaScript, отличающаяся от эталонного асинхронного поведения. Добавлено через 12 минут Причём что интересно, на сайте MDN о данной особенности промисов не упоминается, как и в онлайн-учебнике http://learn.javascript.ru То есть вот здесь ошибка:
2
|
|||
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||||||
| 21.04.2019, 10:37 | ||||||
|
Вот исправление для "правильной" асинхронности промисов в браузере:
1
|
||||||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|||||||
| 22.04.2019, 09:51 [ТС] | |||||||
|
amr-now, такой код:
То что вы написали в сообщении №12 я пока не сильно вкурил . То что там написано, это именно асинхронный код (судя по async/await), но обязательно ли в подобном асинхронном коде присутствие промисов или же это не обязательное условие написания асинхронного JS кода?
0
|
|||||||
|
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
|
||||||
| 22.04.2019, 15:12 | ||||||
Сообщение было отмечено V0fka как решение
Решение
V0fka, последовательность действий:
1) стартуем. 2) выполняем executor промиса - вывелись все надписи в коллбэке. Промис получил статус resolved. 3) Вернули промис в переменную. Результат промиса пока никому не интересен. Едем дальше. 4) отработали 3 паузы с выводом соответствующих надписей. 5) вывели "end". Всё. Текущий "рабочий код" закончился. 6) Смотрим в очередь ожидания в Event Loop. 7) Увидели что в очереди ожидания в Event Loop болтается "рабочий код" метода then(), который как раз соответствует промису в состоянии "Выполнен с любым результатом". В данном случае успешно. 8) Именно асинхронно в классическом понимании выполняем then() для результата 777. --------------- Народ ещё подсказывает, что setImmediate() реализован только в Microsoft и NodeJS. Поэтому асинхронность конструктора промиса пока пришлось закостылить методом setTimeout(callback, 0) Но есть более хитрые способы слегка уменьшить разрывы между циклами Event Loop. Например: https://learn.javascript.ru/setimmediate https://habr.com/ru/post/275023/ Имхо, для достаточно продолжительного "рабочего кода" потери на разрывы Event Loop не будут настолько существенными, как кажутся. setImmediate() всё равно круче )) Добавлено через 3 часа 47 минут Да. Можно использовать фиктивный положительно завершенный промис, а функцию обратного вызова запускать в служебном then():
2
|
||||||
|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
|
| 24.04.2019, 09:03 [ТС] | |
|
amr-now, спасибо за ответы! То что вы пишете это уже слишком продвинутый уровень JavaScript для меня. Сходу не сильно все понятно, постараюсь на досуге осознать все написанное. Еще раз спасибо!
0
|
|
| 24.04.2019, 09:03 | |
|
Помогаю со студенческими работами здесь
15
SetTimeout, clearTimeout - асинхронность, однопоточность Напишите функцию, поведение которой аналогично поведению Promise.race(promises)
Исправить порядок выполнения promise
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|