Цитата:
|
Функция вызывает саму себя, значит это рекурсия.
Стек вызовов из-за асинхронности не растет. Назовите это - асинхронная рекурсия. :) |
Меня другое волнует.
Синхронный код был простой и понятный. Я хочу: 1. Убедиться, что эквивалентный асинхронный код правильный. По тестам это так, но вдруг я что-то не учел. 2. Чтобы асинхронный код был понятен. Не верю, что я решаю уникальную задачу. Возможно уже есть общепринятые паттерны на этот случай. |
И в последнем варианте мне не нравится один момент.
В теле "цикла" приходится добавлять return в двух местах. Кажется, не очевидно, для чего это делается. Меня, как JSера с 2-хмесячным стажем, еще месяц назад это ввело бы в ступор. :blink: whilePromise( isNeedContinue.bind(null, obj), function() { *!*return*/!* doAnything() .then(function() { console.log("Что-то еще в цикле..."); *!*return*/!* Promise.resolve(obj); }, Promise.reject.bind(Promise)) } ) Или я зря страдаю? |
SergeyERjs,
зря страдаешь. "return в двух местах" - это когда в пределах одной функции. Бытует мнение, что это антипаттерн. Хотя нельзя сказать наверняка. (с) У тебя ретурны в разных функциях, только не обязательно делать return Promise.resolve(obj);, достаточно просто return obj; Promise.reject.bind(Promise) вообще ни к селу ни к городу. Как ты это придумал, ума не приложу. Наверняка читал говностатейки по программированию на каком-нибудь говносайтишке. https://learn.javascript.ru/ - здесь и только здесь надо начинать постигать. Правильный вариант: whilePromise( isNeedContinue.bind(null, obj), function() { return doAnything() .then(function(data) { console.log("Что-то еще в цикле..."); return data; }); } ) Тут просто передаем то значение data, которое получили в промисе doAnything(). А вот если надо будет воткнуть что-то асинхронное между итерациями, тогда возвращаем промис. |
Цитата:
function foo() { setTimeout(foo, 1e3) } foo() ? :) |
Цитата:
Alexandroppolus, спасибо! :) Цитата:
Мои основные источники: https://learn.javascript.ru/ + https://javascript.ru/manual + https://developer.mozilla.org/ + http://api.jquery.com/ и т.п. |
Цитата:
И да, это похоже на хвостовую рекурсию (после того, как компилятор её оптимизирует, конечно). Только там итерации следуют непрерывно друг за другом, а здесь раскиданы по таскам в event loop. В обоих случаях не нагромождается стек, нет обратного хода. |
Часовой пояс GMT +3, время: 21:01. |