【问题标题】:request every 5 min in a loop Nodejs在循环Nodejs中每5分钟请求一次
【发布时间】:2021-09-13 07:45:49
【问题描述】:

我需要在循环中向外部服务器发出 get 调用请求,但问题是在循环中调用 all 会导致速率限制,所以我只想每 5 分钟或 10 次左右在循环内进行调用,有没有办法可以帮助实现这一目标。 这是我的代码:

    const util = require('util');

const StravaClientService = require("../../strava/client.service");
const StravaActivityService = require("../../strava/activity.service");
const _ = require("underscore");
const fs = require("fs");
const AWS = require("aws-sdk");
const ids = require("underscore");
const data = require("underscore");


AWS.config.update({
    region: "us-east-1",
});
var docClient = new AWS.DynamoDB.DocumentClient();

module.exports = (router) => {
    router.get("/streams/:id", async (req, res, done) => {
        const userc = req.user;
        const access_token = userc.access_token;

   const ids = [4401422821,
       4401416494,
       4401413107,

       ]
        const stravaClient = StravaClientService.getClient(access_token);
        const activityService = StravaActivityService(stravaClient);
        //
         var params = {
            TableName:"run-id",
             Key: {
                 "id": userc.stravaId,
            }

         };





        docClient.get(params, function(err, data) {
            if (err) {
                console.log("Error", err);
            } else {
                console.log("Success", data.Item.json);
                ids.map(( id ) =>  setTimeout(activityService.streamActivity,5000,id))//data.Item.json

            }
        });

【问题讨论】:

  • 这是一个 lambda 函数吗?
  • 不,我只是在使用 dynamodb

标签: javascript node.js loops strava


【解决方案1】:

基本上,setInterval 在您的场景中就足够了。但是,您可以尝试使用 node-schedule,它有助于管理您的 cron 作业。

【讨论】:

  • 你知道我如何使用它来排队请求而不是使用 set timeout 吗?
  • 刚刚给出的 crontab 表达式看起来像 */5 * * * * 因为它是选项之一。
【解决方案2】:

使用索引进行偏移?

ids.map(( id, index ) =>  setInterval(()=>activityService.streamActivity(id),(5+index) * 60000))//data.Item.json

【讨论】:

    【解决方案3】:

    使用setInterval

    setInterval(() => {
      ids.map(( id ) =>  setTimeout(activityService.streamActivity,5000,id))
    }, 5000); \\ for 5 minutes
    

    【讨论】:

    • 这里的问题是每次迭代都不会在 5 分钟后运行,而是在间隔后运行所有循环
    • 你的意思是每 5 分钟运行一次map 函数,对吧?
    • 是的,如果你知道我的意思,我想在 5 分钟后而不是一次获得每个地图迭代(比如在循环中,我想在 5 分钟后运行每次迭代)
    • 那你为什么不把map放到setInterval的回调中呢?
    • 非常感谢,但它并没有像我想要的那样工作,但 lune 的回答使用索引偏移量解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2021-06-10
    • 2020-02-01
    • 2013-11-29
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多