Каким образом я могу получить данные с сервера и обработав их в цикле отправить другие запросы?
Добрый день, задача заключается в том, что надо получить список id`шников делая запрос по API, а затем иттерируя каждый id отправлять с ним также запрос по API, ответ заносить в массив
idArr представляет собой список из обычных id, перебирая которые можно получить список объектов с этим id
Я понимаю, что цикл у нас синхронный поэтому ответ не успеваю добавлять. Попробовал сделать функцию асинхронной, но результат такой же
function resolveAfterFetch(url) { return new Promise((resolve) => { fetch(url) .then(res => res.json()) .then(result => { resolve(result) }) }); } async function add1() { const idArr = await resolveAfterFetch('https://google.com/newstories.json'); return idArr } add1().then(async v => { for (const value of v) { await resolveAfterFetch(`https://google.com/item/${value}.json?print=pretty`) } }) .then(res => console.log(res)) |
function resolveAfterFetch(url) { return new Promise((resolve) => { fetch(url) .then(res => res.json()) .then(result => { resolve(result) }) }); } async function add1() { const idArr = await resolveAfterFetch('https://google.com/newstories.json'); return idArr } add1().then(async v => { for (const value of v) { await resolveAfterFetch(`https://google.com/item/${value}.json?print=pretty`) } }) .then(res => console.log(res))
Дополнительно:
return new Promise((resolve) => { fetch(url) .then(res => res.json()) .then(result => { resolve(result) }) });return new Promise((resolve) => { fetch(url) .then(res => res.json()) .then(result => { resolve(result) }) });
Зачем ты обернул фетч в промис?
накидаю общую идею:
const anyFetch = async () => fetch(url) .then(arr => arr.map( id => fetch(url + id) )); const allData = Promise.All(anyFetch).then(arrOfFinishData => doSomething(arrOfFinishData)); |
const anyFetch = async () => fetch(url) .then(arr => arr.map( id => fetch(url + id) )); const allData = Promise.All(anyFetch).then(arrOfFinishData => doSomething(arrOfFinishData));
Идея следующая:
1. первый фетч возвращает вам промис с массивом айдишников
2. следующий чанк мапит айдишники в новые промисы, которые уже по каждому айдишниику вместо себя возвращают промис с данными.
3. в итоге anyFetch там, где уже надо работать с конечными данными, засовываем в Promise.All, чтобы дождаться всех данных и в чанке делаем с этими данными doSomething
Ответы:
может быть какой-то очередью воспользоваться? пусть отдельный воркер с каждым api запросом разбирается. и потом в какую-то табличку результаты добавляет. и потом уже смотреть что в табличке появилось и работать с этим.
- Да проблема, что я даже не могу использовать await на втором уровне вложенности. Единственное что приходит на ум это использовать два промиса - первый отдает список id, а второй уже внутри их перебирает и делает запросы. Потом через Promise.all уже выводит результат
- pinkhead_psd, я про то, что может как-то иначе на задачу посмотреть, не как в линейном программировании? поменяйте архитектуру. Что будет, если все вызовы api обработать не сразу, а в несколько этапов? думаю, ничего страшного не случится. а в таком случае и цепочка промисов не нужна.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Для получения данных с сервера и последующей обработки их в цикле для отправки других запросов, вам нужно воспользоваться асинхронными запросами. В зависимости от языка программирования, который вы используете, существуют различные способы реализации этой задачи. Ниже приведен пример решения на языке программирования PHP с использованием cURL:
В данном примере мы отправляем запрос на сервер, получаем данные в формате JSON, преобразуем их в массив и перебираем в цикле. Для каждого элемента массива мы формируем данные для нового запроса на другой сервер и отправляем его с использованием cURL. После обработки ответа на запрос, вы можете добавить свою логику обработки данных.
Убедитесь, что у вас включены расширения PHP cURL для работы с сетью. В случае использования другого языка программирования, необходимо выбрать соответствующий инструмент для работы с HTTP запросами.

Для того чтобы получить данные с сервера и обработать их в цикле для отправки других запросов, вам необходимо использовать асинхронные запросы. В случае использования языка программирования PHP, вы можете использовать библиотеку cURL для выполнения HTTP запросов.
Примерно код на PHP для выполнения запроса на сервер и обработки данных в цикле может выглядеть следующим образом:
// Инициализируем cURL $ch = curl_init(); // Устанавливаем URL и другие необходимые параметры curl_setopt($ch, CURLOPT_URL, "http://example.com/api/data"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Выполняем запрос $response = curl_exec($ch); // Закрываем соединение curl_close($ch); // Обработка данных $data = json_decode($response, true); // Цикл для обработки данных и отправки других запросов foreach ($data as $item) { // Выполняем запрос на сервер с полученными данными // Например, отправляем POST запрос на другой URL $postData = array('param1' => $item['value']); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://anotherexample.com/api/send"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); $response = curl_exec($ch); curl_close($ch); }
В данном примере мы используем cURL для выполнения запроса на сервер, получения данных и обработки их в цикле. Затем мы отправляем другие запросы на другой сервер с обработанными данными.
Убедитесь, что в вашем PHP скрипте включена поддержка cURL, и что вы обрабатываете ошибки запросов и ответов сервера для обеспечения надежности вашего кода.