Установите переменную Javascript каждые n сек. Когда это изменилось также создать массив переменных JSON? - PullRequest
1 голос
/ 02 июля 2010

Моя переменная чисел обновляется каждую секунду с математикой до некоторых чисел, таких как «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.

Ответы [ 2 ]

3 голосов
/ 02 июля 2010

Что не так с вашим подходом? Просто установите свои переменные вне функции, которая повторяется, а затем JSON закодируйте ее .

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

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

Тем не менее, я думаю, что ваша задача может быть отличной возможностью использовать пользовательское событие ! Вы пометили свой вопрос jQuery, поэтому вам следует проверить его метод bind () . Конечно, по этой теме существует множество учебных пособий .

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.

Обновление: Из комментариев к вопросу похоже, что Озаки не ясно, что они могут получить доступ к ранее определенной переменной в своей функции таймера. Определяя переменную вне функции, а затем ссылаясь на нее внутри функции без использования var , которая создаст новую локальную переменную, вы создаете замыкание , где вы делаете переменная внутри функции будет доступна за ее пределами. Как вы, наверное, заметили, я использовал эту технику в обоих своих примерах.

Надеюсь, это поможет.

2 голосов
/ 02 июля 2010

Вот решение:

<code><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">
        

Проверено на Chrome 6.0.447.0 dev

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...