Делать несколько запросов на получение и отслеживать их ответы в Node.js - PullRequest
0 голосов
/ 26 июня 2019

Мне приходится получать запросы к медленному API и отслеживать статус ответа. Я могу получить данные (с другим запросом на получение и другим URL) только после того, как начальный статус отправки будет «Готово». Некоторые поисковые запросы выбираются быстрее, чем другие, поэтому я должен помнить об этом

Я использовал функцию javascript setTimeout и ждал 20 секунд до завершения всех поисковых запросов. Это хит или промах, так как некоторые запросы выбираются быстрее, чем через 20 секунд, а некоторые позже

async function get_dispatch_state(sid) {
  let dispatchState = "";
  let json = await axios.get(
    `https://digitals.devfg.test.com:8089/services/search/jobs/${sid}?output_mode=json`,
    {
      method: "get",
      auth: auth,
      headers: options
    }
  );
  dispatchState = json.data.entry[0]["content"].dispatchState;
  return dispatchState;
}

function get__data() {
  axios({
    method: "get",
    url: `https://digitalsp.devfg.test.com:8089/services/search/jobs/test_search_1/results?output_mode=json`,
    auth: auth,
    headers: options
  })
    .then(datax => {
      fraud_line_1d = datax.data;
      console.log("***Fraud line 1****" + JSON.stringify(fraud_line_1d));
    })
    .catch(error => {
      console.log("second error is " + error);
    });
// repeat other get requests
}


 setTimeout(function() {
       get_data();
}, 20000);

Все данные в конечном итоге выбираются, но с разными интервалами в зависимости от размера поискового запроса. Мне нужен совет о том, как лучше всего получить данные, когда статус отправки завершен.

1 Ответ

3 голосов
/ 26 июня 2019

Вы можете использовать метод Promise.all () , который возвращает одно Обещание , которое разрешается, когда все обещания, переданные как итеративные, разрешены или когда итерируемое не содержит обещаний.Он отклоняет причину первого обещания, которое отклоняет.

function get_dispatch_state(sid) {
    return axios.get(
        `https://digitals.devfg.test.com:8089/services/search/jobs/${sid}?output_mode=json`,
        {
            method: 'get',
            auth: auth,
            headers: options
        }
    )
        .then(json => {
            return json.data.entry[0]['content'].dispatchState;
        });
}

function get__data() {
    axios({
        method: 'get',
        url: `https://digitalsp.devfg.test.com:8089/services/search/jobs/test_search_1/results?output_mode=json`,
        auth: auth,
        headers: options
    })
        .then(datax => {
            fraud_line_1d = datax.data;
            return JSON.stringify(fraud_line_1d);
        });
    // repeat other get requests
}


Promise.all([get_dispatch_state() , get__data()])
.then(data => {
    // Array with the response of both request at the same time    
})

Небольшой пример того, как мы должны его выполнить.

Более подробная информация по теме здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...