如何在javascript中“排队”一段代码

时间:2011-01-18 21:10:07

标签: javascript asynchronous

我创建了一个类,在初始化时,开始下载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 个答案:

答案 0 :(得分:1)

您必须将事件处理程序附加到对象加载完成事件。您正在使用的图书馆必须提供此活动。我不知道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方法,但我希望你明白我的意思。如果不了解您正在使用的库,我无法提供更好的示例。

答案 1 :(得分:0)

超时不是解决此问题的方法。

您希望在请求旁边设置回调函数,以便处理请求的对象知道响应进入时要执行的操作。

从你的代码中不清楚你正在使用什么框架(我无法理解getBlueprint,这似乎是初始化远程请求的调用),所以如果你能提供更多信息在此,我们可以提供更多定制化的帮助。

答案 2 :(得分:0)

您希望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');
});

答案 3 :(得分:0)

我同意回调函数是正确的方法。如果这是您无法修改的代码,您可以执行此类操作,但严重的是,使用回调!

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);
});