|
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
|
||||||
Promise: а где асинхронность?18.04.2019, 15:30. Показов 5150. Ответов 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
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|