Каким образом я могу получить данные с сервера и обработав их в цикле отправить другие запросы?

Ссылка скопирована
2 ответов

Добрый день, задача заключается в том, что надо получить список 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) }) });

Зачем ты обернул фетч в промис?

  • Асинхронный запрос, я же не знаю сколько будет идти ответ от сервера
  • pinkhead_psd, Имеется ввиду что fetch сам по себе является промисом...
  • Понял, принял
  • накидаю общую идею:

    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 обработать не сразу, а в несколько этапов? думаю, ничего страшного не случится. а в таком случае и цепочка промисов не нужна.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Артём Dev Ответ

    Для того чтобы получить данные с сервера и обработать их в цикле для отправки других запросов, вам необходимо использовать асинхронные запросы. В случае использования языка программирования 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 $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, и что вы обрабатываете ошибки запросов и ответов сервера для обеспечения надежности вашего кода.

    Другие ответы (1) Ответить на вопрос
    Никита Орлов

    Для получения данных с сервера и последующей обработки их в цикле для отправки других запросов, вам нужно воспользоваться асинхронными запросами. В зависимости от языка программирования, который вы используете, существуют различные способы реализации этой задачи. Ниже приведен пример решения на языке программирования PHP с использованием cURL:

     

    В данном примере мы отправляем запрос на сервер, получаем данные в формате JSON, преобразуем их в массив и перебираем в цикле. Для каждого элемента массива мы формируем данные для нового запроса на другой сервер и отправляем его с использованием cURL. После обработки ответа на запрос, вы можете добавить свою логику обработки данных.

    Убедитесь, что у вас включены расширения PHP cURL для работы с сетью. В случае использования другого языка программирования, необходимо выбрать соответствующий инструмент для работы с HTTP запросами.

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно