2015-03-27 5 views
6

Io uso Reflux, e normalmente mi sto attivando dopo aver effettuato una chiamata ajax, e funziona bene. A scopo di test non ho avuto bisogno di una chiamata Ajax e ho notato che il trigger non funzionerà a meno che non dessi un timeout minimo di 5ms. Qui ci sono esempi funzionanti e non funzionanti.Il trigger di Reflusso non funzionerà senza un ritardo in init

Non funziona esempio:

window.threadStore = Reflux.createStore 
    init: -> 
    @state = @getInitialState() 
    @fetchThreads() 
    getInitialState: -> 
    loaded: false 
    threads: [] 
    fetchThreads: -> 
    # ajax call for not Testing, and just trigger for Testing 
    @state.threads = FakeData.threads(20) 
    @state.loaded = true 
    @trigger(@state) # This will NOT work! 

Ciò funzionerà:

window.threadStore = Reflux.createStore 
    init: -> 
    @state = @getInitialState() 
    @fetchThreads() 
    getInitialState: -> 
    loaded: false 
    threads: [] 
    fetchThreads: -> 
    # ajax call for not Testing, and just trigger for Testing 
    @state.threads = FakeData.threads(20) 
    @state.loaded = true 
    setTimeout(=> 
     @trigger(@state) # This WILL work! 
    , 500) 

Può spiegare perché non funziona senza ritardo e dovrebbe? È un bug o qualcosa che non capisco.

risposta

5

Questo perché i componenti recuperano l'array vuoto da getInitialState e si verifica dopo l'invocazione dello trigger.

init viene chiamato quando viene creata l'istanza del negozio, il che significa che il trigger in fetchThreads viene richiamato immediatamente prima del montaggio di un componente. Quando il Componente di ascolto viene successivamente montato, ottiene invece l'array vuoto dallo store su getInitialState.

Io suggerirei la seguente modifica:

window.threadStore = Reflux.createStore 
    init: -> 
    @state = 
     loaded: false 
     threads: [] 
    @fetchThreads() 
    getInitialState: -> 
    @state # TODO: State should be cloned for sake of concurrency 
    fetchThreads: -> 
    # NOTE: Assign a new state for the sake of concurrency 
    @state = 
     loaded: true 
     threads: FakeData.threads(20) 
    @trigger(@state) # This will SHOULD work now ;-) 
Problemi correlati