2017-02-21 23 views
1

У меня есть компонент под названием PlatformMain, который в настоящее время зависит от глобального объекта channel из Phoenix, определенного внутри файла компонента.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, 
    }); 
    } 

Мой вопрос, если я хочу «reduxify» вызов channel.push, где я должен поставить его? Чувствуется странным, что у него нет channel.push(...) где-то еще, так как это вызов API. Я собирался поставить его в саге, используя 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

 Смежные вопросы

  • Нет связанных вопросов^_^