Цитата:
|
Функция вызывает саму себя, значит это рекурсия.
Стек вызовов из-за асинхронности не растет. Назовите это - асинхронная рекурсия. :) |
Меня другое волнует.
Синхронный код был простой и понятный. Я хочу: 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, время: 04:08. |