#javascript #fetch
Вопрос:
Я новичок в js и не понимаю, почему мой цикл не работает.
(async () =gt; { let arr = [] while(ticket.stop != true) { let data = await fetch("https://front-test.beta.aviasales.ru/search") let commit = await data.json() let ticketsURL = "https://front-test.beta.aviasales.ru/tickets?" Object.keys(commit) "=" Object.values(commit) let ticketFetch = await fetch(ticketsURL) let ticket = await ticketFetch.json() console.log(ticket) arr.push(ticket) } })()
Комментарии:
1. Пожалуйста, любезно расскажите, чего вы хотите достичь с помощью этого кода, объясните, что пошло не так на основе этого кода.
2. @BatyrkhanAkzholov когда я делаю запрос на выборку в финальном вызове ticketFetch, я получаю массив, содержащий более 346 элементов? Что именно ты пытаешься сделать?
Ответ №1:
Правка: ваш код возвращает массив, содержащий более 346 элементов, и то, что вы пытаетесь сделать, просто повторяет цикл снова и снова и вызывает их. Можете ли вы объяснить, что вы пытаетесь сделать со своим кодом?
Я не знаю точно, что вы пытаетесь сделать со своим кодом, но это должно отличаться в зависимости от вашего варианта использования, однако то, что вы пытаетесь сделать, можно резюмировать в a async-call-inside-a-loop
. Теперь следует помнить одну вещь, когда вы создаете цикл, есть две основные вещи, которые следует иметь в виду,
- переменные цикла и индекс
- область действия цикла
Ключевым моментом является то, что когда вы запускаете функцию внутри цикла, она получает свой собственный контекст и, следовательно, сохраняет значение. Однако прямой вызов некоторых асинхронных вызовов завершится ошибкой. Поэтому JavaScript предлагает вам что-то, что может решить эту проблему, и они называются Immediately Invoked Function Expression
или IIFE
короче. Это именно то, что вы сделали, однако вы завернули в него весь цикл.
В двух словах, IIFE получает свой собственный контекст, поэтому каждый следующий IIFE, созданный циклом, будет работать и разрешаться отдельно.
const length = array.length; for(var i = 0; i lt; length; i ){ (function(index) { const response = // some async call }(i)); }
Комментарии:
1. » [IIFE] — это именно то, что вы сделали, однако вы завернули в него всю петлю». — и это было правильно. Помещение IIFE в цикл нарушило код, так как теперь вы даже не меняете переменную цикла во время выполнения цикла, делая его бесконечным циклом. (И вы не исправили фактическую проблему создания
ticket.stop
исключения, когдаticket
этоundefined
происходит ).2. » прямой вызов некоторых асинхронных вызовов завершится ошибкой » — нет, абсолютно нет. Использование
await
внутренних циклов прекрасно и именно то, что нужно оператору.3. @Bergi к сожалению, вы не поняли общей идеи, которую я пытаюсь здесь изложить. Во-первых, я серьезно не знаю, что ОП пытается сделать со своим кодом. Однако я пытаюсь обобщить с помощью лучшего метода, чтобы получить отдельный стек для операции.
4. Лучший метод? То, что вы делаете, совершенно сложно, имо. Может быть, если вы не знаете, что пытается сделать ОП, не пишите ответ?
5. @frostzt Если вы не знаете, что пытается сделать ОП, попросите разъяснений в комментариях. И нет, я понял вашу идею, я просто говорю, что «получение отдельного стека» не лучше, но на самом деле неправильно давать условие цикла.