0

このjsFiddleは私の問題を浮き彫りにします。
これは、オブジェクトが定義され、socket.ioを介してページに送信される機能を模倣しています。

が関数であるかどうかをチェックするsetInterval関数Potsがあり、関数である場合はイベントを発生させます。そのイベントの間、私は新しいインスタンスをインスタンス化しようとしますPotsが、それは未定義であるとだけ言われます。

コード:

var Pots;

$(document).ready(function(){
    var timerId = 0;
    var otherTimer = 0;

    otherTimer = setInterval(function() { console.log("Creating"); Pots = function() {}; }, 5000);

    timerId = setInterval(function() {
        console.log("Checking");

        if (_.isFunction(Pots)) {
            console.log(Pots);
            clearInterval(timerId);
            clearInterval(otherTimer);

            var evt = document.createEvent('Event');
            evt.initEvent('ObjectsAvailable', true, true);
            document.dispatchEvent(evt);
        }

    }, 1000);

});

document.addEventListener('ObjectsAvailable', function(e) {
    console.log(Pots);
    var Pots = new Pots();
});  

編集
このコメントを以下に投稿しました:これは実際にはこの宣言を含むBackbonejsコレクションである
ことを指摘する必要が。私がイベントを行った理由は、「Pots」が設定されていないときがあるためです(おそらく、ブラウザがPotsが宣言されたファイルをロードする前に)。jsFiddleは、その時間が存在することをシミュレートするためだけのものでした。私の実際のコードでは「otherTimer」は存在せず、Potsは最終的には関数ですが、イベント中に使用しようとすると機能しません。Potsvar Pots = Backbone.Collection.extend({model: Pot});ObjectsAvailable

4

1 に答える 1

3

グローバル変数「Pots」を任意の値に設定することはないため、未定義のままになります。

「ObjectsAvailable」ハンドラーは設定しようとしているように見えますが、

  1. これを行うために「Pots()」を呼び出そうとするため、機能しません。
  2. ローカル変数「Pots」も宣言するため、グローバル変数は非表示になります。

別の注意:フィドルは、ウィンドウの「ロード」ハンドラーで実行されるコードで設定されているため、「準備完了」ハンドラーは冗長です。

于 2012-08-11T18:11:42.323 に答える