当前位置: 代码迷 >> JavaScript >> 每n秒设置一次Javascript变量。 更改时还创建一个变量的json数组吗?
  详细解决方案

每n秒设置一次Javascript变量。 更改时还创建一个变量的json数组吗?

热度:20   发布时间:2023-06-03 18:09:49.0

我的数字变量通过数学随机性每秒更新到一些数字,例如“ 14323121”,我也希望每秒钟将它们保存到一个数组中,例如最近的10个左右。

function EveryOneSec() {
    var numbers = math.Random(); // I want to create an array from this...
setTimeOut(EveryOneSec, 1000);
};

要将“数字”绑定到数组:(请参见上面的var数字)我想创建一个如下所示的数组,例如最近的10个更新?

{"numbers":["2021030213","32454253"]} // For Reigel..
//doesnt have to be key value pairs. just need the value in legit json.

您的方法有什么问题? 只需在重复的函数之外设置变量,然后对其进行 。

var numbers = [];
var jsonString = "";

function EveryOneSec() {
  numbers.push(Math.random());
  jsonString = JSON.stringify({'numbers': numbers});
  setTimeout(EveryOneSec, 1000);
}

但是,我认为您的任务可能是使用的绝好机会! 您标记了问题jQuery,因此您应该查看其方法。 当然,有很多关于该主题的 。

var numbers = [];
var aPlaceholder = document.createElement("div");
aPlaceholder.bind("arrayUpdatedEvent", {'numbers': numbers}, arrayUpdatedHandler);

function arrayUpdatedHandler(event) {
  var jsonString = JSON.stringify(event.data);
  // do something with your JSON
}

function EveryOneSec() {
  // add number to array
  numbers.push(Math.random());
  // trigger custom event
  aPlaceholder.trigger("arrayUpdatedEvent");
}

// call every 1 second, store in var to be able to cancel it later
var myInterval = setInterval(EveryOneSec, 1000);

如您所见,这里有很多代码。 但是,引入自定义事件将为您提供强大的功能,因为现在您已经将变量更新与JSON创建分离了。 此外,您可以添加其他侦听器,也许还可以记录更新后的数组,并在数组更新和JSON创建之间插入其他步骤。 例如, EveryOneSec()可以触发另一个事件verifyArrayEvent ,并且只有在数组验证后,它才会触发arrayUpdatedEvent

更新:从注释到问题,似乎Ozaki不清楚他们是否可以在其定时器函数中访问以前定义的变量。 通过在函数外部定义变量,然后在不使用var的情况下在函数内部引用变量,这将创建一个新的局部变量,您将创建一个 ,您可以在函数外部使用对函数内部变量的操作它。 您可能已经注意到,我在两个示例中都使用了这种技术。

希望能有所帮助。

这是一个解决方案:

<html>
<head>
    <title>S.O. 3163764</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    <script type="text/javascript">
    // dump() borrowed from http://www.openjs.com/scripts/others/dump_function_php_print_r.php
    const REPEAT = 3 * 1000; // ms
    const TO_KEEP = 10; // numbers to be kept
    var gObject = { 'numbers': [] };

    /**
     * Function : dump()
     * Arguments: The data - array,hash(associative array),object
     *    The level - OPTIONAL
     * Returns  : The textual representation of the array.
     * This function was inspired by the print_r function of PHP.
     * This will accept some data as the argument and return a
     * text that will be a more readable version of the
     * array/hash/object that is given.
     * Docs: http://www.openjs.com/scripts/others/dump_function_php_print_r.php
     */
    function dump(arr,level) {
        var dumped_text = "";
        if(!level) level = 0;

        //The padding given at the beginning of the line.
        var level_padding = "";
        for(var j=0;j<level+1;j++) level_padding += "    ";

        if(typeof(arr) == 'object') { //Array/Hashes/Objects 
            for(var item in arr) {
                var value = arr[item];

                if(typeof(value) == 'object') { //If it is an array,
                    dumped_text += level_padding + "'" + item + "' ...\n";
                    dumped_text += dump(value,level+1);
                } else {
                    dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
                }
            }
        } else { //Stings/Chars/Numbers etc.
            dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
        }
        return dumped_text;
    }

    function everyNSec() {
        var number = Math.random(); 
        store(number);
        window.setTimeout(everyNSec, REPEAT);
    };

    function store(aNumber) {
        gObject.numbers.push(aNumber);

        while (gObject.numbers.length > TO_KEEP)
            gObject.numbers.shift();

        $("#dump").html(dump(gObject));
    }

    $(document).ready(function() {
        everyNSec();
    });
    </script>
    </head>
    <body>
        <pre id="dump">
        </pre>
    </body>
</html>

在Chrome 6.0.447.0开发人员上测试