Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.10.2023, 15:47
Интересующийся
Отправить личное сообщение для kuliev Посмотреть профиль Найти все сообщения от kuliev
 
Регистрация: 14.10.2016
Сообщений: 10

Ajax и рекурсия
Доброго времени суток.

function getOption(id = null){

      let option = '';
      $.ajax(
      {
        url: './ajax.php',
        type: 'post',
        dataType: 'json',
        data: {
          id: id
        },
        success: function(data){
          if(data.has_next === true){
            getOption(data.result[data.result.length - 1].id)
            
            for(i = 0; i < data.result.length; i++){
              option += '<option value="' + data.result[i].id + '">' + data.result[i].title + '</option>';
            }

          } else {
            for(i = 0; i < data.result.length; i++){
              option += '<option value="' + data.result[i].id + '">' + data.result[i].title + '</option>';
            }
          }
        }
      });
  }


Вот кусок рекурсивной функции, она вызывает саму себя до тех пор пока data.has_next === true. Отправляя запрос на сервер - запрашиваем опции для выпадающего списка, сервер в свою очередь отдает списки частями (по сто штук в списке, и если есть продолжение то сервер возвращает has_next = true)

Так вот, если смотреть в консоле, то данные приходят в ответ на запрос. Вопрос в том как получить эти данные если я вызываю данную функцию из тела другой функции, а возвратить полученные данные из рекурсии не могу.
Ответить с цитированием
  #2 (permalink)  
Старый 22.10.2023, 16:52
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,774

Использовать асинхронное программирование (с Promise, async await)
Как то так это записать можно

async function getOption(id = null){
	function getPart (id) {
		return new Promise (res => {			
			$.ajax(
			{
				url: './ajax.php',
				type: 'post',
				dataType: 'json',
				data: {
				  id: id
				},
				success: function(data){
					let option = '';
					for(i = 0; i < data.result.length; i++){
						option += '<option value="' + data.result[i].id + '">' + data.result[i].title + '</option>';
					}
					res ({next:data.has_next, option, endsId: data.result[data.result.length - 1]?.id}) ;
				}
			});
		})
	}
	
    let option = '';
    let endsId = id;
	do {
		const res = await getPart(endsId);
		option += res.option;
		endsId = res.endsId;
	} while (res.next);
	
	return option;
}

// Вызов из асинхронной функции

const options = await getOption ();
	// тут обработка результата
	
// Вызов из обычной функции

getOption().then (options => {
	// тут обработка результата
});

Последний раз редактировалось voraa, 22.10.2023 в 18:06.
Ответить с цитированием
  #3 (permalink)  
Старый 23.10.2023, 14:18
Интересующийся
Отправить личное сообщение для kuliev Посмотреть профиль Найти все сообщения от kuliev
 
Регистрация: 14.10.2016
Сообщений: 10

Благодарю за ответ. Сам вчера весь день штудировал про Promise, но что-то толком у меня не получилось.

Взял Ваш код, немного поправил и все получилось. Спасибо!

Для тех кому вдруг понадобиться такая штука...
async function getOption(id = null){
    function getPart (id) {
      return new Promise (promise => {
        $.ajax(
        {
          url: './ajax.php',
          type: 'post',
          dataType: 'json',
          data: {
            id: id
          },
          success: function(data){
            let option = '';
            
            for(i = 0; i < data.result.length; i++){
              option += '<option value="' + data.result[i].id + '">' + data.result[i].value + '</option>';
            }
            
            promise ({
              next:data.has_next, 
              option, 
              endsId: data.result[data.result.length - 1]?.id
            }) ;
          }
        });
      })
    }

    let start = true;
    let option = '';
    let endsId = id;
    
    while (start){
      const promise = await getPart(endsId);
      option += promise.option;
      endsId = promise.endsId;
      start = promise.next;
    }

    return option;
  }

  // Вызов из асинхронной функции
  const options = (async () => {await getOption()});
  // тут обработка результата

  // Вызов из обычной функции
  getOption().then (options => {
    console.log(options)
  });
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка формы после ajax проверки ShutTap Общие вопросы Javascript 15 08.04.2016 11:46
Объект ajax и приостановка функции kilohertz_. AJAX и COMET 5 18.01.2015 16:33
too much recursion рекурсия ajax запросов timach jQuery 0 17.01.2013 12:05
Проблема с AJAX Dim@ AJAX и COMET 4 16.09.2012 22:52
Ajax разбор метода mycoding jQuery 14 21.05.2010 10:57