|
|
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
Всем привет! Есть следующая задача: выполняется асинхронный запрос по получению базовых объектов, после их получения по each'у иду по всем полученным объектам и для каждого запрашиваю его дочерние объекты,потом так же по каждому полученному дочернему объекту запрашиваю его объекты и опять по each'у иду и запрашиваю его дочерние объекты. То есть получается три известных уровня а остальные не известны. Мне нужен callback по завершению всех этих вложенных запросов. Понятно что asyncjs, но как его приспособить не соображу в данной ситуации. Что можете посоветовать в данной ситуации? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 13:14 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
kasik, а не проще ли получить всю структуру сразу с сервера? зачем делать столько запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 13:40 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
Нет такое не рассматривается, архитектура приложения сейчас именно такая. Есть унифицированный набор интерфейсов для общения с сервером и он меняться на кастомные не будет. Поэтому нужно решение задачи именно в этом виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 13:49 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
есть какая-то библиотечка, название забыл. выглядит примерно так: Код: javascript 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 14:08 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
Ну это понятно, это промисы ну так я и получаю на первом уровне базовые объекты но потом в этом зене еще один зен а в нем еще - и все они заканчиваются в разное случайное время и мне нужен момент когда все отработают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 15:02 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
вот, набросок: Код: 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. имеем массив объектов, изначально в нем только null - парент для верхних объектов. current - текущий обрабатываемый парент. на каждой итерации проходим до конца массива, по каждому пункту грузим чилды. После загрузки чилдов добавляем их в конец массива. Так же считаем сколько на данный момент происходит запросов (reqCount). Банкет завершается, когда не осталось запросов, и дошли до конца массива. всякие там обработки ошибок добавь самостоятельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 15:21 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
Cпасибо за код! Вчера его полночи приспосабливал к реалиям. И возник большой вопрос как правильно выйти из данного лупа, потому что есть ситуация, что на заключительном этапе для полученных объектов мне не нужно получать больше чилдренов это конечные объекты в иерархии и поэтому если я из getChilds буду возвращать пустой массив то будет бесконечный луп тк на следующий элемент никогда не перейдет а будет крутиться на нем одном как он только встретится. А если ничего не возвращать то количество реквестов не будут уменьшаться и в конце концов будет равное количеству тех объектов которые являются конечными. Пришлось изменить условие(реквест не равно 0 а равно количеству этих элементов в objects) и вставить его после вайл. Но это как то не оч локанично, может есть более красивые решения. Что на самом деле нужно что бы правильно выйти из рекурсии? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2015, 12:29 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
kasikкак правильно выйти из данного лупа, потому что есть ситуация, что на заключительном этапе для полученных объектов мне не нужно получать больше чилдренов это конечные объекты в иерархии и поэтому если я из getChilds буду возвращать пустой массив то будет бесконечный луп тк на следующий элемент никогда не перейдет а будет крутиться на нем одном как он только встретится. А если ничего не возвращать то количество реквестов не будут уменьшаться и в конце концов будет равное количеству тех объектов которые являются конечными.не очень понял проблему. если getChilds вернет пустой массив, то ничего не добавится в objects. тогда current останется равен objects.length. И при окончании последнего запроса (когда reqCount обнулится) будет вызван итоговый callback ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2015, 13:21 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
Я тоже так думал, но когда именно на этом типе возвращается пустой массив почему то попадает в луп и не сдвигается текущий эдемент на ту строчку не попадает, то есть прибавляется реквест срабатывает респонс с пустым массивом вычитается реквест на следующем этапе опять прибавляется реквест и вычитается в респонсе и опять заново до curren++ не доходит почему то. Может быть связано с тем что в getChilds у меня запросы идут по типу парента, тк они различаются и при типе который конечный запрос уже не делается а просто возвращаетс я callback([]) и вот так попадает в луп. А если ничего не возвращать то в реквесте будут копиится колво элементов являющимися заключительными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2015, 13:43 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
Может, Promise? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2015, 14:31 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
Внутри при запросе обектов они и испольхуются. Но речь не об этом, а о том как выйти правильно из рекурсии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2015, 15:01 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2015, 17:02 |
|
||
|
Многоуровневая асинхронность
|
|||
|---|---|---|---|
|
#18+
ага все получилось теперь как надо, большое спасибо! Честно говоря не понял поселдовательности выполения операций инкрементации, почему сначала отправляется значение переменной, а потом уже сама инкрементация а не сначала инкрементация и результат как индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2015, 18:12 |
|
||
|
|

start [/forum/topic.php?fid=22&msg=39103460&tid=1445635]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
148ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 421ms |

| 0 / 0 |
