2016-04-23 17 views
4

Vorschläge zur Verbindung redux/react-native zu socket.io nach eine HTTP-Anfrage? Ich muss die HTTP-Anfrage erst machen, um ein Authentifizierungs-Session-Cookie zu speichern, und dann eine Verbindung zu socket.io herstellen. Alle Beispiele, die ich gesehen habe (d. H. https://www.npmjs.com/package/redux-socket.io), werden sofort mit socket.io verbunden. Mein Denken ist, auf Aktionen hören und wie so in benutzerdefinierter redux Middleware verbinden:React-native Redux socket.io Sitzungsauthentifizierung

import React from 'react-native' 
import * as actions from './actions/'; 
import io from 'socket.io-client/socket.io'; 

export default socketMiddleware = (store) => { 
    return next => action => { 
    const result = next(action); 
    // var socket = io(); 
    // 
    if (action.type === 'HTTP_CONNECT_SUCCEEDED') { 
     debugger; 
     const socket = io('localhost:3000', {jsonp: false); 
     socket.on('connect', function(){console.log('Connected!')}); 
    } 
    // 
    // socket.on('message', data => { 
    // store.dispatch(actions.addResponse(data)); 
    // }); 
    // 
    // if (socket && action.type === actions.ADD_MESSAGE) { 
    // let messages = store.getState().messages; 
    // socket.emit('message', messages[messages.length -1]); 
    // } 

    return result; 
    }; 
} 

Dies funktioniert zu verbinden, aber ich habe meine Steckdose innerhalb der ‚HTTP_CONNECT_SUCCESS‘ bedingt, zu definieren und so meine andere Socket-Aktionen und Veranstaltungen undefiniert, bis diese Aktion passiert. Wie kann ich mit einer Aktion eine Verbindung zu WS herstellen und auch meine Socket-Ereignisse und andere Aktionen anzeigen?

Antwort

0

Mein hoffentlich temporärer Hack ist meine Buchse Variable global, und wickeln Sie Ereignisse in einer abhängig zu machen:

import React from 'react-native' 
import * as actions from './actions/'; 
import io from 'socket.io-client/socket.io'; 

export default socketMiddleware = (store) => { 
    return next => action => { 

    const result = next(action); 
    globalSocket = typeof globalSocket === 'undefined' ? false : globalSocket 

    if (action.type === 'HTTP_CONNECT_SUCCEEDED') { 
     globalSocket = io('http://localhost:3000', {jsonp: false}); 
     globalSocket.on('connect',() => { 
     console.log('Connected!') 
     }); 
    } 

    if (globalSocket != false) { 
     globalSocket.on('friends', data => { 
     store.dispatch(actions.updateFriends(data)); 
     }) 

     if (action.type === 'CREATE_QUESTION') { 
     globalSocket.emit('createQuestion', action.question); 
     } 
    } 

    return result; 
    }; 
} 
+0

marginalen Verbesserung, aber man konnte ein 'var' anstelle einer globalen, dh' var verwenden socket = null 'anstelle von' globalSocket = typeof ... '. Dann setzen Sie in Ihrem 'if (action.type === 'HTTP_CONNECT_SUCCEEDED') '' socket' und senken Sie' if (globalSocket! = False) 'nach' if (socket) '. – BarthesSimpson