首页 > 解决方案 > 如何在节点 js 中使用计时器发出 api 请求?

问题描述

我有一个包含一些数据的数组,并且必须为每个数据项发出一个 api 请求。api 将保持不变,但每次发出 api 请求时数组索引都会增加。此外,必须以 5 分钟的间隔调用 api 请求。因此我不能一次调用整个数组的 api。使用请求正文中的 Array[0] 进行一次 api 调用,5 分钟后使用请求正文中的 Array[1] 进行 api 调用。我尝试实现具有这些要求的 cron 作业,但是在带有 api 调用的 for 循环中没有合适的 cron 作业示例。任何帮助,将不胜感激。`

const array = ['http://linkedin.com/charles123', 'http://linkedin.com/darwin123' ... ]

//API needs to be called every 5 minutes
const sendConnectionRequest = () => {
var i = 0;
for(i; i< array.length, i++) {
  fetch("serverurl:123", {
    headers: {
     'Content-Type': 'application/json'
    },
    method: "POST",
    body: JSON.stringify(array[i])
  })
  .then((res) => if(res) { console.log('Connection Request Send') } )
 }
}`

标签: node.jscron

解决方案


我可以建议使用异步生成器,这将允许您管理顺序承诺。

const fetch = require("node-fetch");
const sleep = require("util").promisify(setTimeout);

async function* responseGenerator(urls) {
    let iterations = 0;

    while (urls.length) {
        const [url, ...rest] = urls;

        urls = rest;

        if (iterations > 0) {
            await sleep(50000);
        }

        yield fetch("serverurl:123", {
            headers: {
                "Content-Type": "application/json"
            },
            method: "POST",
            body: JSON.stringify(url)
        });

        iterations += 1
    }
}

const array = ['http://linkedin.com/charles123', 'http://linkedin.com/darwin123' ]

for await (const response of responseGenerator(array)) {
    // response.status
    // response.statusText
    // response.contentType
}

推荐阅读