2012-03-27 9 views
0

私はカウントダウンタイマーを表示するためにnode.jsとsocket.ioを使用しています。タイマーはnode.js上で実行されており、socket.ioを介してクライアントに時刻を送信しています。時間はsetTimeoutを使用しています。node.js socket.ioタイマー - シングルトンパターン?

問題は、各接続で、時間を取得してタイマーを発行する新しいプロトタイプクラスをインスタンス化していますが、時間はすべてのユーザーにとって同じである必要があります。理想的には、io.sockets.emitを使用します( 'socket'コールバックを使用することに反対します)。その後、すべてのクライアントに時間が送信されます(これが望ましい動作です)。

これで、接続するすべてのクライアントに新しいオブジェクトが追加されるため、タイマーに時間がかかることになります。

JavaScriptでは、シングルトンパターンがこの解決策になりますか?

私はこれを使用しようとしましたが、動作していないようでした。私はそれを呼んでいる

var Auction = function() { 

    Auction.instance = null; 

    if(!Auction.instance) { 
     Auction.instance = this; 
    } else { 
     console.log('instance'); 
     return Auction.instance; 
    } 

} 

Auction.prototype = { 

    init: function() { 
     //setTimeout is defined here, along with a lot of other stuff 
    }; 

} 

やって:

var auction = new Auction; 
auction.init(); 

これはまだオブジェクトを複数回作成されます。

どのような提案も素晴らしいでしょう。ありがとうございました。

答えて

1
Auction.instance = null; 

if(!Auction.instance) { 

それはnullに設定するステートメントに続くので、このif句は常に通過します。一度関数の外にnullに設定したい場合は、newを実行するたびにシングルトンをクリアするため、インスタンスを作成するたびに設定する必要はありません。

あなたの場合、も同様にnullのものをすべて削除することができます。

+0

気付いているので、initを何度も実行していて、setTimeoutをやり直しているようです。 – dzm

+0

@dave: '.init()'の後に続く任意の呼び出しがno-opsでなければならないことを意味しますか?その場合、最初に '.init'を空の関数で上書きしなければなりません。 – pimvdb

1

クライアントの接続時にnew Actioninitに電話すると、複数のタイマーが作成されます。接続ハンドラの外でこれを一度行う必要があります。

編集:これを済ませたら、@ pimvdbの助言に従ってください。

関連する問題