2017-12-24 14 views
1

私はソケットの同じインスタンスを維持するために、ソケットIOで働いている、とシングルトンパターンを適用したいJS SocketIOシングルトン

両方main.js & device.jsがロードされています

import ioInstance from './socket'  
console.log(ioInstance) 

Device.js:

が、異なるソケットインスタンス

Main.jsを持っています

import ioInstance from './socket' console.log(ioInstance) 

socket.js:

import io from 'socket.io-client' 
export const ioInstance = io('http://192.168.1.15:1337') 

私はこれを行うための多くの方法を試みたが、私は常に異なるソケットインスタンスを持っている...行う方法上の任意の手掛かりを持っ

誰でもそれは正しい?ありがとう

+0

あなたの実行環境は何ですか?ブラウザ? node.js?電子? – jfriend00

+0

私はubuntuに乗っており、エクスプレスサーバーとChromeをブラウザとして実行しています –

+0

このコードは、ubuntuでnode.jsで実行されていますか、このChromeブラウザコードですか? – jfriend00

答えて

2

あなたの実際のシングルトンコードはシングルトンとして全く動作していません。

const socketConnection = { 
    _instance: null, 
    get instance() { 
    if (!this._instance) { 
     this._instance = { 
     setConnection() { 
      return io('http://192.168.0.11:1337') 
     }, 
     } 
    } 
    return this._instance 
    } 
} 

そして、あなたが参照している:あなたはこれを持っている場合はio('http://192.168.0.11:1337')たびに呼び出している

socket.instance.setConnection() 

あなたはthis._instanceがすでに設定されている場合でも、setConnection()を参照します。それが問題です。代わりに、を呼び出した結果をinstanceに保存またはキャッシュする必要があります。あなたはまた、問題を単純化することができ

import socket from './socket' 
console.log(socket.instance); 
socket.instance.on(...); 

:その後、ちょうどシングルトンソケットを参照するために、これを使用して、

const socketConnection = { 
    _instance: null, 
    get instance() { 
    if (!this._instance) { 
     this._instance = io('http://192.168.0.11:1337'); 
    } 
    return this._instance; 
    } 
} 

をそして:


あなたはこれに変更することで、それを修正することができちょうどこれを持っている:

import io from 'socket.io-client' 

const socketConnection = io('http://192.168.0.11:1337'); 

export default socketConnection; 

そして、そしてちょうどシングルトンソケットを参照するためにこれを使用する:あなたがあなたの元に実際のシングルトンのコードを示した場合

import socket from './socket' 
console.log(socket); 
socket.on(...); 

FYI、私たちは、おそらくあなたの質問を投稿した後、数分でこれを解決しているだろう質問。実際のコードを表示するのは、擬似コードの例を作成するよりも、実際のコードを表示するほうがずっと良いです。なぜなら、実際のソリューションを識別するために実際のコードを確認する必要があるためです。

+0

応答してくれてありがとう。私は単純なconstをエクスポートしようとしましたが、それでも2つのインスタンスが作成されています(あなたの推薦に従ってアップデートされたgithubブランチを確認できます) https://github.com/hhochart29/Sockanvas/tree/socketSingleton –

+0

@Hervé - これをクライアント用にバンドルするにはwebPackを使用していますか?もしそうなら、実際に何が行われているかを見るためにブラウザで実行される実際に生成されたコードを見ましたか? – jfriend00

+0

私は確かにwebpackを使用しています。できるだけ早く見ていきます –