setInterval сразу, затем подождите 5 секунд - PullRequest
0 голосов
/ 26 января 2019

Я создаю приложение Node.js, и у меня есть функция setInterval, которая запускается каждые 5 секунд.Моя проблема в том, что эта функция должна быть запущена до того, как любой из моих маршрутов сработает в этом файле.

Мне нужно сразу запустить setInterval при запуске приложения, а затем запускать каждые 5 секунд после этого.

До сих пор я пытался установить setInterval на меньшее значение, но это слишком сильно влияет на мою внешнюю службу, так как этот формат кода будет использоваться в куче файлов (~ 30).

var express = require('express');
var router = express.Router();
const config = require("../config/config");

const request = require("request");
var consul = require("consul")({host: '10.0.1.248'});
var consulBase = [];
var options;


setInterval(() => {
  consul.catalog.service.nodes('auth', function(err, results) {
    if(err) {console.log(err); throw err;}
    if(results.length <= 0) throw 'Unable to find any services with that name.. exiting process...';
    if(results.length > 0) consulBase = [];
    results.forEach((result) => {
      consulBase.push(result.ServiceAddress+ ':' +result.ServicePort);
    });
    var serviceURL = 'http://' + consulBase[Math.floor(Math.random()*consulBase.length)];
    options = {
      baseUrl : serviceURL
    };
  });
}, 5 * 1000);

router.get('/login', (req, res) => {
  request.get(req.path, options, (error, response, body) => {
    if (error) throw error;
    res.send(body);
  });
});


module.exports = router;

Я был бы готов поместить это в другой файл и затем представить его в виде функции, которая принимает имя службы и выдает переменную options с нужными мне данными.Не уверен, как бы я это сделал.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Возможно, вы захотите посмотреть на запланированные задачи для узла, используя пакет вроде node-cron . Например, следующий код будет выполняться каждые 5 секунд

var cron = require('node-cron');

yourCode();

cron.schedule('*/5 * * * * *', () => {
  yourCode();
});


function yourCode(){
  console.log('running every 5 seconds');
}

Без узла-cron

yourCode();

setInterval(() => {
  yourCode();
}, 5 * 1000);


function yourCode (){
  console.log('running every 5 seconds');
}

В отдельных файлах

//code.js
module.exports.yourCode= (req, res) =>{
    console.log('running every 5 seconds');
}

//app.js
const yourCode = require ('./code').yourCode;

yourCode();

setInterval(() => {
  yourCode ();
}, 5 * 1000);
0 голосов
/ 26 января 2019

Обернуть setInterval простым методом, который вызывает функцию в аргументе, затем создает интервал и возвращает идентификатор интервала.

let intervalId = executeAndRepeat(function(){
    //do your thing
    if(someCondition)
        return clearInterval(intervalId);
}, 5 * 1000);

function executeAndRepeat(fcn, intervalTime){
    fcn();
    return setInterval(fcn, intervalTime);
}
...