网站搜索

javascript - 在 map() 函数中为 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

你可以尝试来自 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);
}