在map()函数中为axios请求设置延迟/超时

时间:2019-07-11 22:04:29

标签: javascript node.js typescript axios

我正在使用node和axios(使用TS,但这不是太重要)来查询API。我有一套脚本,可以调用不同的端点并记录数据(有时对其进行过滤)。这些脚本用于调试目的。我试图通过在请求之间添加延迟来使这些脚本“更好”,以免“炸毁” API,尤其是当我尝试传递较大的数组时。因此,基本上我希望它发出GET请求并在发出下一个请求之前暂停一段时间。

我尝试使用setTimeout()函数,但是我只是将它们放在执行请求后会增加延迟的地方。我插入的函数到处都有这个结果。我知道为什么要得到这个结果,我只需要尽我所能,至少可以加深我对事情如何进行的了解。

虽然我有关于尝试建立队列或尝试使用拦截器的想法,但是我认为我可能与那些想法的简单解决方案“相距甚远”。

此外,我还有一个即时编写的“基本脚本”(这是这批脚本的出生点),它是使用for循环而不是map()函数构造的,并且promise.all。我也尝试过在该脚本中设置延迟,但是我没有得到任何帮助。

var axios = require('axios');
var fs = require('fs');

const Ids = [arrayOfIds];

try {
    // Promise All takes an array of promises
   Promise.all(Ids.map(id => {
        // Return each request as its individual promise
        return axios 
          .get(URL + 'endPoint/' + id, config)
    }))

    .then((vals) =>{
        // Vals is the array of data from the resolved promise all
        fs.appendFileSync(`${__dirname}/*responseOutput.txt`, 
vals.map((v) => {
            return `${JSON.stringify(v.data)} \n \r`
        }).toString())
    }).catch((e) => console.log)
} catch (err) {
  console.log(err);
}

以上代码无错误;只是无法弄清楚如何正确设置延迟。

1 个答案:

答案 0 :(得分:0)

您可以尝试bluebird中的Promise.map

它可以选择设置concurrency

var axios = require('axios');
var fs = require('fs');
var Promise = require('bluebird');

const Ids = [arrayOfIds];

let concurrency = 3;  // only maximum 3 HTTP request will run concurrently

try {

    Promise.map(Ids, id => {

        console.log(`starting request`, id);

        return axios.get(URL + 'endPoint/' + id, config)

    }, { concurrency })

    .then(vals => {
        console.log({vals});
    })
    ;

} catch (err) {
  console.log(err);
}