Как «поставить в очередь» кусок кода в JavaScript - PullRequest
1 голос
/ 19 января 2011

Я создал класс, который при инициализации начинает загружать файл JSON.

Однако загрузка выполняется асинхронно.Поэтому после того, как я объявил об этом, я начал работать с ним, но это не удалось, потому что он еще не загрузил файл.

Я мог бы отключить асинхронную синхронизацию, но есть ли другой способ без зависания браузера?

В настоящее время я работаю над этим с опцией setTimeout, но это похоже на уродливый хак.

  var d;
  $(document).ready(function() {
      d = new Duk('element');
      d.getBlueprint('hud.json');
      setTimeout(start, '2000');
  });

  function start(){
      test = new d.Dialog(d.blueprint.screens.test);
      test.draw();
  }

Ответы [ 4 ]

1 голос
/ 19 января 2011

Вы должны прикрепить обработчик события к событию завершения загрузки объекта.Библиотека, с которой вы работаете, должна предоставить это событие.Я не знаю, что такое Duk или что делает getBlueprint(), но вы должны проверить документацию на предмет того, что это за класс и метод, и посмотреть, есть ли обратный вызов при неполном завершении.Если есть, вы бы сделали что-то вроде этого:

$(document).ready(function() {
    d = new Duk('element');
    d.getBlueprint('hud.json', {
        onComplete: function() {
            test = new d.Dialog(d.blueprint.screens.test);
            test.draw();
        }
    });
});

Очевидно, я только что выдумал это.Я не знаю, есть ли в вашей библиотеке метод onComplete, определенный таким образом, но я надеюсь, вы понимаете, о чем я.Не зная больше о библиотеке, которую вы используете, я не могу привести лучший пример.

0 голосов
/ 19 января 2011

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

function wait_for_load(expr, func)
{
    var interval = window.setInterval(function()
    {
        if(eval(expr))
        {
            window.clearInterval(interval);
            func();
        }
    }, 20);
}

var d;
$(document).ready(function() {
    d = new Duk('element');
    d.getBlueprint('hud.json');
    wait_for_load('d.blueprint', start);
});
0 голосов
/ 19 января 2011

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

function getBlueprint(file, callback)
{
    // do whatever to get the file
    // ...
    // trigger the callback
    callback();
}

$(document).ready(function() {
    var d;
    function start(){
        test = new d.Dialog(d.blueprint.screens.test);
        test.draw();
    }
    d = new Duk('element');
    d.getBlueprint('hud.json', start);
    setTimeout(start, '2000');
});
0 голосов
/ 19 января 2011

Тайм-ауты не являются способом решения этой проблемы.

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

Из вашего кода неясно, какую платформу вы используете (я не могу понять, что такое getBlueprint, что, по-видимому, является вызовом, который инициализирует удаленный запрос), поэтому, если вы могли бы предоставить больше информации об этом, мы можем предоставить более индивидуальную помощь.

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