我有一个名为PlatformMain
的组件,它当前依赖于在组件文件中定义的Phoenix的全局channel
对象。
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,
});
}
我的问题是,如果我想&#34; reduxify&#34; channel.push调用,我应该把它放在哪里?由于它是一个API调用,因此在其他地方没有channel.push(...)
感觉很奇怪。我打算像使用redux-saga一样把它放在一个传奇中:
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
的初始化放在自己的文件中并将其导出并导入多个位置,那么它不会多次执行该文件(并因此多次加入该通道)?
答案 0 :(得分:1)
您可以将channel
的初始化放在自己的文件中并安全地多次导入,模块的评估只发生一次。您可以查看the spec进行确认:
如果此模块已经过评估,则不执行任何操作。否则,传递性地评估该模块的所有模块依赖性,然后评估该模块。