JavaScript: объект гарантии инициализирован - PullRequest
0 голосов
/ 11 августа 2011

У меня работает код, который инициализирует пакет абстрагированных графов. После создания экземпляра графа я получаю данные с помощью запроса get с сервера и хочу обновить провайдеров данных графа. Проблема в том, что иногда (для IE6-8) объект, содержащий провайдер данных, еще не инициализирован, поэтому при попытке обновить данные происходит сбой JavaScript

Как я могу сделать задержку кода, пока объект не будет готов? Псевдо:

...
...
...
// Init code
$graph = new Graph();
...
...
...
// GET request
$.getJSON(..., ..., function(data) {
  ...
  ...
  ...
  // Make sure that $graph.series[0] is ready
  // Should not use while, but something similar in functionality
  while (!($graph.series && $graph.series[0]))
    ; // Sleep the code until object is ready

  // Set the dataprovider after init complete
  $graph.series[0].setData(data);
  ...
  ...
  ...
});
...
...
...

Привет

Ответы [ 2 ]

0 голосов
/ 19 августа 2011

Я сделал нечто подобное пару дней назад.В этом коде я проверяю, что объект gAuto был инициализирован с необходимым свойством.Надеюсь, это поможет.

function check(callback) {
    if (gAuto.hasOwnProperty('gm_accessors_')) {
        callback();
    } else {
        console.log('waiting for init');
        init(callback);
    }
}

function init(callback) {
    console.log('initializing');
    setTimeout(function() {
        check(callback);
    }, 1);
}

init(function() {
    console.log('init done!');
            // access 'gm_accessors_' here
});
0 голосов
/ 11 августа 2011

Вместо вашего while цикла (как вы определили, не совсем то, что вы хотите), используйте setTimeout.

$.getJSON(..., ..., function(data) {
    processData();
    function processData() {
        if (!($graph.series && $graph.series[0])) {
            // Not ready yet, schedule to try again in a moment
            // and quit
            setTimeout(processData, 0);
            return;
        }

        // It's there, process
        $graph.series[0].setData(data);
    }
});

Задержка, конечно, будет больше, чем 0 миллисекунд(обычно не менее 5-10), но это дает другому коду возможность инициализировать этот объект для вас.Возможно, вы захотите добавить тайм-аут, чтобы вы не зацикливались бесконечно, если что-то пошло не так.может, потому что processData является замыканием в контексте обратного вызова, поэтому он имеет постоянную ссылку на все, что находится в области действия в этом контексте (включая data).Подробнее: Затворы не сложны

...