2011-01-18 44 views
1

我已經創建了一個類,它在初始化時開始下載JSON文件。如何在javascript中「排隊」一段代碼

但是,下載是異步運行的。 所以在我聲明它之後,我開始使用它,但它失敗了,因爲它尚未加載文件。

我可以關閉異步,但有沒有凍結瀏覽器的方式嗎?

我目前正在用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(); 
    } 
+0

爲什麼你傳遞一個字符串作爲`setTimeout`的第二個參數?顯然它會被強制爲一個數字,但爲什麼不首先使用數字文字呢? – 2011-01-18 21:14:16

+0

你在使用什麼庫?什麼是`Duk`,getBlueprint()是做什麼的? – 2011-01-18 21:16:09

回答

0

超時並不是解決此問題的方法。

你要設置旁邊的請求的回調函數,以便處理請求的對象知道當響應進來做什麼。

它是從你的代碼不清楚你所使用的架構(我無法理解getBlueprint,這似乎是初始化遠程請求的調用),所以如果您可以提供更多關於此的信息,我們可以提供更多的自定義幫助。

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方法,但我希望你明白我的意思。不知道更多關於你正在使用的圖書館,我無法舉一個更好的例子。

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'); 
}); 
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); 
}); 
相關問題