发出多个获取请求并在Node.js中跟踪其响应

时间:2019-06-26 19:54:42

标签: node.js async-await

我必须向慢速API发出get请求,并跟踪响应状态。一旦初始调度状态为“完成”,我就只能获取数据(带有另一个get请求和另一个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 个答案:

答案 0 :(得分:3)

您可以使用 Promise.all()方法返回一个 Promise ,当作为迭代对象传递的所有承诺都已解决或当迭代对象不包含任何承诺时,此解析。它以第一个承诺被拒绝的理由拒绝。

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    
})
  

我们应如何实施的小样本。

有关主题here的更多信息。