Axios.all,如何配置axios等待时间来缓解挂机?

时间:2018-04-18 22:30:59

标签: node.js asynchronous promise async-await axios

我的应用程序使用内部Web服务来获取数据,我有一个作业创建大约500个请求,这些请求被异步完成获取操作。 我使用Axios,创建一个axios promises数组,然后使用Axios.all()解析它们。

它工作正常,直到大约200个请求但发布我的套接字挂起,但是在服务器端我看到请求正在处理。

如何配置axios以设置自定义超时,或者更好的方法是拼接我的promises数组然后将它们作为多个批次运行?

  

源代码

let getAxiosPromiseArray = (urlList) => {
    var axiosArrayofPromise = [];

    return new Promise ( (resolve, reject) => {


        try {
            urlList.forEach ( (URL) => {
                axiosArrayofPromise.push(axios.get(URL));
            });
            resolve(axiosArrayofPromise);

        }
        catch (err) {
            reject("There is a problem getting Axios array of promises " + err);
        }

    })
}

async function processAxiosPromises (PromiseArray) {
    try {
        var results = []
        results =  await axios.all(PromiseArray);
        return results;
    }
    catch(err) {
        throw("There was a problem resolving promises array (Axios) " + err);
    }


}


getallID().then ( (urlList) => {
    return getAxiosPromiseArray(urlList);
}).then( (AxiosPromises) => {
    return processAxiosPromises(AxiosPromises);
}).then ((resultData) => {
    console.log(resultData);
});
  

错误

There was a problem resolving promises array (Axios) Error: socket hang up

2 个答案:

答案 0 :(得分:1)

首先,这对函数getAxiosPromiseArray()processAxiosPromises()需要修复。

您的new Promise()构造是不必要的。您可以简单return Promise.all(arrayofPromise)(或axios.all(...),如果必须的话)并取消其他功能。

将剩余的函数重命名为有意义的函数,最终会得到例如:

let getData = (urlList) => {
    return Promise.all(urlList.map(URL => axios.get(URL)))
    .catch(error => {
        error.message = "There is a problem getting Axios array of promises " + error.message; // augment the error message ...
        throw error; // ... and re-throw the errror.
    });
};

请致电如下:

getallID().then(getData)
.then(resultData => {
    console.log(resultData);
}).catch(error => {
    console.error(error);
});

这会让你站稳脚跟,但就其自身而言,不太可能解决并发问题(如果它是什么),最简单的方法是使用Bluebird's Promise.map concurrency选项。

来电者代码可以保持不变,只需更改getData(),如下所示:

let getData = (urlList) => {
    let concurrency = 10; // play with this value to find a reliable concurrency limit
    return Promise.map(urlList, URL => axios.get(URL), {'concurrency': concurrency})
    .catch(error => {
        error.message = "There is a problem getting Axios array of promises " + error.message;
        throw error;
    });
};
// where `Promise` is Bluebird.

答案 1 :(得分:0)

const axios = require('axios');
const axiosThrottle = require('axios-throttle'); 
//pass axios object and value of the delay between requests in ms
axiosThrottle.init(axios,200)
const options = {
  method: 'GET',
};
const urlList = [
  'https://jsonplaceholder.typicode.com/todos/1',
  'https://jsonplaceholder.typicode.com/todos/2',
  'https://jsonplaceholder.typicode.com/todos/3',
  'https://jsonplaceholder.typicode.com/todos/4',
  'https://jsonplaceholder.typicode.com/todos/5',
  'https://jsonplaceholder.typicode.com/todos/6',
  'https://jsonplaceholder.typicode.com/todos/7',
  'https://jsonplaceholder.typicode.com/todos/8',
  'https://jsonplaceholder.typicode.com/todos/9',
  'https://jsonplaceholder.typicode.com/todos/10'
];
const promises = [];
const responseInterceptor = response => {
  console.log(response.data);
  return response;
};

//add interceptor to work with each response seperately when it is resolved
axios.interceptors.response.use(responseInterceptor, error => {
  return Promise.reject(error);
});

for (let index = 0; index < urlList.length; index++) {
  options.url = urlList[index];
  promises.push(axiosThrottle.getRequestPromise(options, index));
}

//run when all promises are resolved
axios.all(promises).then(responses => {
  console.log(responses.length);
});

https://github.com/arekgotfryd/axios-throttle