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

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

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

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

Код: javascript
1.
чтототам(function(){}).then(function(){}).then(function(){})...
...
Рейтинг: 0 / 0
14.11.2015, 15:02
    #39103460
kasik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневая асинхронность
Ну это понятно, это промисы ну так я и получаю на первом уровне базовые объекты но потом в этом зене еще один зен а в нем еще - и все они заканчиваются в разное случайное время и мне нужен момент когда все отработают.
...
Рейтинг: 0 / 0
14.11.2015, 15:21
    #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
15.11.2015, 12:29
    #39103750
kasik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневая асинхронность
Cпасибо за код!

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

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

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

Может быть связано с тем что в getChilds у меня запросы идут по типу парента, тк они различаются и при типе который конечный запрос уже не делается а просто возвращаетс я callback([]) и вот так попадает в луп.
А если ничего не возвращать то в реквесте будут копиится колво элементов являющимися заключительными.
...
Рейтинг: 0 / 0
15.11.2015, 14:31
    #39103791
Многоуровневая асинхронность
Может, Promise?
...
Рейтинг: 0 / 0
15.11.2015, 15:01
    #39103806
kasik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневая асинхронность
Внутри при запросе обектов они и испольхуются. Но речь не об этом, а о том как выйти правильно из рекурсии
...
Рейтинг: 0 / 0
15.11.2015, 17:02
    #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
15.11.2015, 18:12
    #39103879
kasik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многоуровневая асинхронность
ага все получилось теперь как надо, большое спасибо!

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


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