每隔X秒在服务器中生成randomNumber

时间:2017-04-03 13:13:48

标签: javascript node.js settimeout

背景

我正在创建一个Node.js应用程序,它每6秒生成一个随机数,并通过API提供。

为了使数字生成逻辑不在API文件中,我将其封装在另一个文件中名为numberGen的函数中。

api.js

const express = require("express");
const numberFactory = require("../numberGen.js");

module.exports = (function() {
    let interval = 6, min = 0, max = 100;

    const api = express.Router();
    const numberGen = numberFactory({
        interval, min, max
    });
    numberGen.run();

    api.get("/Numbers/", (req, res) => {
        res.json({ random: numberGen.currNum});       
    });

    return api;
})();

numberGen.js

"use strict";

module.exports = function(args) {
    let {
        interval,
        min,
        max
    } = args;

    let currNumber = genRandom(min, max);

    function run() {
        setTimeout(() => {
            currNumber = genRandom(min, max);
            run();
        }, interval);
    }

    function genRandom(min, max){
        return Math.floor(Math.random() * max) + min;
    }

    return {
        interval, currNumber,
        run
    };
};

理想情况下,客户端在0秒时发出请求,得到数字X,并在6秒后发出相同的请求,得到数字Y,因为服务器每6秒生成一个新的随机数。

问题

这里的问题是客户端总是得到相同的数字,无论如何。

试作

起初我认为这种情况正在发生,因为numberGen正在返回一个永不改变的对象。为了解决这个问题,我尝试将一个数字从api.js传递到生成器进行更新,但由于客户端总是获取一个空对象,所以它没有工作,因为serverNum === undefined;

numberGen.js

"use strict";

module.exports = function(args) {
    let {
        interval,
        min,
        max,
        serverNum
    } = args;

    serverNum = genRandom(min, max);

    function run() {
        setTimeout(() => {
            serverNum= genRandom(min, max);
            run();
        }, interval);
    }

    function genRandom(min, max){
        return Math.floor(Math.random() * max) + min;
    }

    return {
        interval,
        run
    };
};

api.js

const express = require("express");
const numberFactory = require("../numberGen.js");

module.exports = (function() {
    let interval = 6, min = 0, max = 100, serverNum;

    const api = express.Router();
    const numberGen = numberFactory({
        interval, min, max, serverNum
    });
    numberGen.run();

    api.get("/Numbers/", (req, res) => {
        res.json({ random: serverNum});       
    });

    return api;
})();

问题

考虑到我想将此逻辑与api.js文件分开,我该如何修复我的代码?

2 个答案:

答案 0 :(得分:4)

您返回的对象在该特定时间点包含currNumber的值 - 而非参考。添加一个函数,该函数返回数字的实际当前值,并调用该函数而不是numberGen.currNum

<强> numberGen.js

module.exports = function(args) {
  // add this function
  function getNumber() {
    return currNumber;
  }
}

<强> api.js

api.get("/Numbers/", (req, res) => {
    res.json({ random: numberGen.getNumber()});       
});

答案 1 :(得分:0)

或者您可以将代码简化为 的 api.js

const express = require("express");


module.exports = (function() {
let interval = 6, min = 0, max = 100, serverNum;

const api = express.Router();
function genRandom(min, max){
    return Math.floor(Math.random() * max) + min;
}

setInterval(function () {
    serverNum=genRandom(min,max)
    console.log(serverNum);
}, 6000);

api.get("/Numbers/", (req, res) => {
    res.json({ random: serverNum});
});

return api;
})();