Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 13.07.2017, 10:35
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,664

SergeyERjs,
У тебя вызов функции уплыл куда-то в анонимном коллбэке и непонятно когда вернется, это не рекурсия.
Ответить с цитированием
  #12 (permalink)  
Старый 13.07.2017, 11:42
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,007

Сообщение от nerv_
Прозвучит странно, но я бы не называл это рекурсией. Скорее просто отложенный вызов функции самой себя (привет асинхронность).

У рекурсии есть прямой и обратный ход, глубина.
я думаю, тут некая разновидность хвостовой рекурсии )
Ответить с цитированием
  #13 (permalink)  
Старый 13.07.2017, 13:02
Интересующийся
Отправить личное сообщение для SergeyERjs Посмотреть профиль Найти все сообщения от SergeyERjs
 
Регистрация: 03.07.2017
Сообщений: 19

Функция вызывает саму себя, значит это рекурсия.
Стек вызовов из-за асинхронности не растет.
Назовите это - асинхронная рекурсия.

Последний раз редактировалось SergeyERjs, 13.07.2017 в 13:06.
Ответить с цитированием
  #14 (permalink)  
Старый 13.07.2017, 13:10
Интересующийся
Отправить личное сообщение для SergeyERjs Посмотреть профиль Найти все сообщения от SergeyERjs
 
Регистрация: 03.07.2017
Сообщений: 19

Меня другое волнует.
Синхронный код был простой и понятный.
Я хочу:
1. Убедиться, что эквивалентный асинхронный код правильный.
По тестам это так, но вдруг я что-то не учел.
2. Чтобы асинхронный код был понятен.
Не верю, что я решаю уникальную задачу. Возможно уже есть общепринятые паттерны на этот случай.
Ответить с цитированием
  #15 (permalink)  
Старый 13.07.2017, 13:23
Интересующийся
Отправить личное сообщение для SergeyERjs Посмотреть профиль Найти все сообщения от SergeyERjs
 
Регистрация: 03.07.2017
Сообщений: 19

И в последнем варианте мне не нравится один момент.
В теле "цикла" приходится добавлять return в двух местах. Кажется, не очевидно, для чего это делается. Меня, как JSера с 2-хмесячным стажем, еще месяц назад это ввело бы в ступор.
whilePromise(
	isNeedContinue.bind(null, obj),
	function() {
		*!*return*/!* doAnything()
			.then(function() {
				console.log("Что-то еще в цикле...");
				*!*return*/!* Promise.resolve(obj);
			}, Promise.reject.bind(Promise))
	}
)

Или я зря страдаю?
Ответить с цитированием
  #16 (permalink)  
Старый 13.07.2017, 14:00
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,007

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(). А вот если надо будет воткнуть что-то асинхронное между итерациями, тогда возвращаем промис.
Ответить с цитированием
  #17 (permalink)  
Старый 13.07.2017, 14:07
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Alexandroppolus
я думаю, тут некая разновидность хвостовой рекурсии )
а как бы вы назвали это:
function foo() {
  setTimeout(foo, 1e3)
}
foo()

?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 13.07.2017 в 14:10.
Ответить с цитированием
  #18 (permalink)  
Старый 13.07.2017, 14:18
Интересующийся
Отправить личное сообщение для SergeyERjs Посмотреть профиль Найти все сообщения от SergeyERjs
 
Регистрация: 03.07.2017
Сообщений: 19

Цитата:
.then(function(data)
Точно! Вот я же чую, чо-то не так. Проще должно быть.
Alexandroppolus, спасибо!

Цитата:
Наверняка читал говностатейки...
А вот это лишнее замечание.

Мои основные источники:
https://learn.javascript.ru/
+ https://javascript.ru/manual
+ https://developer.mozilla.org/
+ http://api.jquery.com/ и т.п.
Ответить с цитированием
  #19 (permalink)  
Старый 13.07.2017, 15:27
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,007

Сообщение от nerv_ Посмотреть сообщение
а как бы вы назвали это:
function foo() {
  setTimeout(foo, 1e3)
}
foo()

?
ну по сути это в кратком виде тема сабжа.

И да, это похоже на хвостовую рекурсию (после того, как компилятор её оптимизирует, конечно). Только там итерации следуют непрерывно друг за другом, а здесь раскиданы по таскам в event loop. В обоих случаях не нагромождается стек, нет обратного хода.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Правильно сделать универсальное условие по выбору и снятию чекбоксов? olegalimov Events/DOM/Window 9 13.06.2017 09:31
не могу открыжить все чекбоксы нажатием одного nenastiy Events/DOM/Window 11 23.05.2010 17:50
Как правильно прописать свой код в .js Всеми_Любимый Элементы интерфейса 6 23.02.2010 21:34
Как правильно послать XML в POST запросе LowCoder AJAX и COMET 10 15.07.2009 23:20
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37