powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Многоуровневая асинхронность
13 сообщений из 13, страница 1 из 1
Многоуровневая асинхронность
    #39103414
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Есть следующая задача:
выполняется асинхронный запрос по получению базовых объектов, после их получения по each'у иду по всем полученным объектам и для каждого запрашиваю его дочерние объекты,потом так же по каждому полученному дочернему объекту запрашиваю его объекты и опять по each'у иду и запрашиваю его дочерние объекты. То есть получается три известных уровня а остальные не известны. Мне нужен callback по завершению всех этих вложенных запросов.

Понятно что asyncjs, но как его приспособить не соображу в данной ситуации.

Что можете посоветовать в данной ситуации?
Спасибо
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103426
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kasik,
а не проще ли получить всю структуру сразу с сервера? зачем делать столько запросов?
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103429
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет такое не рассматривается, архитектура приложения сейчас именно такая. Есть унифицированный набор интерфейсов для общения с сервером и он меняться на кастомные не будет. Поэтому нужно решение задачи именно в этом виде.
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103433
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть какая-то библиотечка, название забыл. выглядит примерно так:

Код: javascript
1.
чтототам(function(){}).then(function(){}).then(function(){})...
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103460
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это понятно, это промисы ну так я и получаю на первом уровне базовые объекты но потом в этом зене еще один зен а в нем еще - и все они заканчиваются в разное случайное время и мне нужен момент когда все отработают.
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103475
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, набросок:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function getChilds(parent, callback) {
    // тут загружаем массив чилдов по паренту
}

function getAll(callback) {
    var objects = [null];
    var current = 0;
    var reqCount = 0;
    
    function request() {
        if (!reqCount && (current == objects.length)) {
            callback(objects);
            return;
        }
        while (current < objects.length) {
            reqCount++;
            getChilds(objects[current], response);
            current++;
        }
    }
    function response(data) {
        reqCount--;
        objects.push.apply(objects, data);
        request();
    };

    request();
}



имеем массив объектов, изначально в нем только null - парент для верхних объектов.
current - текущий обрабатываемый парент.
на каждой итерации проходим до конца массива, по каждому пункту грузим чилды.
После загрузки чилдов добавляем их в конец массива.
Так же считаем сколько на данный момент происходит запросов (reqCount).
Банкет завершается, когда не осталось запросов, и дошли до конца массива.

всякие там обработки ошибок добавь самостоятельно.
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103750
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cпасибо за код!

Вчера его полночи приспосабливал к реалиям. И возник большой вопрос как правильно выйти из данного лупа, потому что есть ситуация, что на заключительном этапе для полученных объектов мне не нужно получать больше чилдренов это конечные объекты в иерархии и поэтому если я из getChilds буду возвращать пустой массив то будет бесконечный луп тк на следующий элемент никогда не перейдет а будет крутиться на нем одном как он только встретится. А если ничего не возвращать то количество реквестов не будут уменьшаться и в конце концов будет равное количеству тех объектов которые являются конечными.

Пришлось изменить условие(реквест не равно 0 а равно количеству этих элементов в objects) и вставить его после вайл. Но это как то не оч локанично, может есть более красивые решения.

Что на самом деле нужно что бы правильно выйти из рекурсии?
Спасибо
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103764
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kasikкак правильно выйти из данного лупа, потому что есть ситуация, что на заключительном этапе для полученных объектов мне не нужно получать больше чилдренов это конечные объекты в иерархии и поэтому если я из getChilds буду возвращать пустой массив то будет бесконечный луп тк на следующий элемент никогда не перейдет а будет крутиться на нем одном как он только встретится. А если ничего не возвращать то количество реквестов не будут уменьшаться и в конце концов будет равное количеству тех объектов которые являются конечными.не очень понял проблему.
если getChilds вернет пустой массив, то ничего не добавится в objects.
тогда current останется равен objects.length. И при окончании последнего запроса (когда reqCount обнулится) будет вызван итоговый callback
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103774
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже так думал, но когда именно на этом типе возвращается пустой массив почему то попадает в луп и не сдвигается текущий эдемент на ту строчку не попадает, то есть прибавляется реквест срабатывает респонс с пустым массивом вычитается реквест на следующем этапе опять прибавляется реквест и вычитается в респонсе и опять заново до curren++ не доходит почему то.

Может быть связано с тем что в getChilds у меня запросы идут по типу парента, тк они различаются и при типе который конечный запрос уже не делается а просто возвращаетс я callback([]) и вот так попадает в луп.
А если ничего не возвращать то в реквесте будут копиится колво элементов являющимися заключительными.
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103791
Может, Promise?
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103806
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внутри при запросе обектов они и испольхуются. Но речь не об этом, а о том как выйти правильно из рекурсии
...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103855
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kasikМожет быть связано с тем что в getChilds у меня запросы идут по типу парента, тк они различаются и при типе который конечный запрос уже не делается а просто возвращаетс я callback([]) и вот так попадает в луп.вот именно по этому.
т.е. в этом случае, как я понял, getChilds сразу синхронно вызывает callback, и он срабатывает раньше, чем ожидалось.

поправки в коде:

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function getAll(callback) {
    var objects = [null];
    var current = 0;
    var reqCount = 0;
    
    function request() {
        if (!reqCount && (current == objects.length)) {
            callback(objects);
            return;
        }
        while (current < objects.length) {
            reqCount++;
            getChilds(objects[current++], response);
        }
    }
    function response(data) {
        reqCount--;
        objects.push.apply(objects, data);
        request();
    };

    request();
}


...
Рейтинг: 0 / 0
Многоуровневая асинхронность
    #39103879
kasik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага все получилось теперь как надо, большое спасибо!

Честно говоря не понял поселдовательности выполения операций инкрементации, почему сначала отправляется значение переменной, а потом уже сама инкрементация а не сначала инкрементация и результат как индекс.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Многоуровневая асинхронность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]