2014-10-27 10 views

risposta

27

Non riesco a vedere dove si trova il reindirizzamento nell'essenza che hai postato. Vedo solo le azioni AUTH_SIGNIN e AUTH_SIGNIN_SUCCESS, e sembrano piuttosto semplici.

Ma no, non c'è nessun trucco per creare un'azione nel bel mezzo di una spedizione, e questo è di progettazione. Le azioni non dovrebbero essere cose che causano un cambiamento. Dovrebbero essere come un giornale che informa l'applicazione di un cambiamento nel mondo esterno, e quindi l'applicazione risponde a quelle notizie. I negozi causano cambiamenti in se stessi. Le azioni li informano appena.

Se si verifica questo errore, è necessario eseguire il backup e osservare come si gestisce l'azione originale. Molto spesso, puoi impostare la tua applicazione per rispondere all'azione originale, realizzare tutto ciò che devi fare ed evitare di provare a creare una seconda azione.

+17

In realtà è molto comune che per esempio il componente A crea un azione che cambia negozio B quale componente C sta ascoltando e in risposta il componente C ha bisogno di recuperare i dati dal server che è un'azione, ma il dispatcher continua a inviare i dati, quindi non può farlo. La soluzione a questo mi sembra abbastanza hacky (avvolgendo l'azione di recupero in un setTimeout o simile) – Esailija

+0

Immagino che sia meglio non causare un invio per * iniziare * una richiesta (l'unica ragione per farlo è mostrare spinners di caricamento ecc. in ogni caso, ma in realtà non sono realmente i dati dell'applicazione, ma piuttosto lo stato dei componenti) – Esailija

+3

I componenti non devono decidere quando recuperare i dati. Questa è la logica dell'applicazione nel livello vista. Questa logica appartiene allo store, che può sparare all'XHR e quindi il callback error/success crea azioni con i nuovi dati. – fisherwebdev

4

È possibile farlo funzionare da "scheduling" l'azione successiva invece di chiamare direttamente, ecco un esempio di codice:

// instead of doing this 
Dispatcher.dispatch(...); 

// go like this 
setTimeout(function() { 
    Dispatcher.dispatch(...); 
}, 1); 

Questo farà sì che la vostra prossima spedizione di essere chiamato in seguito fuori della spedizione corrente processo e nessun errore accadrà.

Se il codice di invio è su una richiamata qualsiasi altra operazione asincrona che funzionerà ugualmente (ad esempio in una risposta per una richiesta Ajax).

Sto usando questo stile per fare in modo che alcune forme rispondano ai dati generici qui e non ho alcun problema, almeno per come la sto usando.

+2

shitty, ma funziona per me –

+2

uuughhh - gli hack setTimeout sono orribili. Meglio usare le promesse –

+3

@DanOsborne Non penso che le promesse risolvano nulla qui, dal momento che non terminano automaticamente il thread corrente di esecuzione come fa il setTimeout. Se sto fraintendendo, potresti pubblicare un esempio? Grazie! –

0

Antirimbalzo è una soluzione migliore:

var _ = require('lodash'); 
var CHANGE_EVENT = "change"; 
var ApplicationStore = _.extend({}, EventEmitter.prototype, { 

    emitChange: function() { 
    this.emit(CHANGE_EVENT); 
    }, 

    addChangeListener: function(callback) { 
    this.on(CHANGE_EVENT, _.debounce(callback, 100)); 
    }, 

removeChangeListener: function(callback) { 
    this.removeListener(CHANGE_EVENT, callback); 
    }, 

    getState: function(){ 
    return { 
     showConsole: _showConsole 
    } 
    } 
}); 
+0

Non è il modo corretto per farlo, perché quando si esegue il debouncing della funzione ne si ottiene uno diverso, quindi la rimozione del listener delle modifiche non funzionerà come previsto, poiché i callback hanno un contesto diverso – Kamil

+0

@ Kamil _.debounce (callback) .cancel() ; – backslash112

-1

è possibile all'utente la "rinviare" opzione nel dispatcher. Nel tuo caso sarebbe come:

Dispatcher.dispatch.defer(...); 
+0

Il dispatcher non ha il metodo di posticipo. 'Uncaught TypeError: _dispatcher.dispatcher.dispatch.defer non è una funzione ' – rosencreuz

0

È possibile verificare se il dispatcher è dispacciamento, come ad esempio:

if(!MyDispatcher.isDispatching()) { 
    MyDispatcher.dispatch({...}); 
} 
Problemi correlati