2017-02-21 12 views
1

コンポーネントのファイル内でPhoenixのグローバルchannelオブジェクトに現在依存しているPlatformMainというコンポーネントがあります。Phoenix + React NativeとRedux:チャネルオブジェクトはどこに置く必要がありますか?

let channel; 
let socket = new Socket("...", {params: {token: window.userToken}}); 
socket.connect(); 


class PlatformMain extends React.Component { 
    componentWillMount() { 
    this.connectUser(); 
    } 

    connectUser() { 
    const { user } = this.props; 
    channel = socket.channel("user_pool:" + user.email, { app: APP }); 
    this.setupChannel(); 
    } 

    setupChannel() { 
    channel.join() 
     .receive("ok",() => { console.log("Successfully joined call channel") }) 
     .receive("error",() => { console.log("Unable to join") }) 

    channel.on("match_found", payload => { 
     ... 
    }); 
    ... 
} 

ユーザーがボタンを押すと、アクションをディスパッチしてメッセージをチャンネルにプッシュすることもできます。

onPress() { 
    console.log("APPROVE_MATCH"); 
    const { peer, waitForResponse } = this.props; 

    approveMatch(peer); 
    channel.push("approve_match", { // <------ want to put this somewhere else 
     "matched_client_email": peer.email, 
    }); 
    } 

私が質問したいのは、channel.push呼び出しを「還元」したいのですが、どこに置くべきですか? API呼び出し以来、別の場所でchannel.push(...)を持っていないのは気になりません。私はそうのようなReduxの-サガを使用してサガに入れるつもりだった:

function* approveMatch(action) { 
    const peer = action.payload.peer; 
    channel.push("approve_match", { // <------- but how would I get the same channel object? 
    "matched_client_email": peer.email, 
    }); 
} 

export default function* watchMatchingStatus() { 
    yield takeEvery(matchingStatusActions.APPROVE_MATCH, approveMatch); 
} 

しかし、私は同じチャネルオブジェクトを指す必要があると思いませんか?どうすればいい?もし私がchannelの初期化をそれ自身のファイルに入れて、それを複数の場所にエクスポートしてインポートすると、ファイルを複数回実行しないで、結果的にチャンネルに何度も参加しますか?

答えて

1

channelの初期化を独自のファイルに入れて、複数回も安全にインポートすることができます。モジュールの評価は一度しか行われません。あなたは確認のためthe specを確認することができます。このモジュールは、既に評価されている場合

は何もしません。それ以外の場合は、このモジュールのすべてのモジュール依存関係を推移的に評価し、このモジュールを評価します。

+0

大変感謝! – Edmund

関連する問題