2011-01-18 14 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'の第2引数として渡していますか?明らかに数字に強制的に変換されますが、最初に数値リテラルを使用するのはなぜですか? –

+0

あなたはどのライブラリを使用していますか? 'Duk'とは何ですか?' getBlueprint() 'は何をしますか? –

答えて

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

+1:getBluePrintはコールバックを許可する必要があります –

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); 
}); 
関連する問題