2015-03-27 10 views
6

Używam Reflux, i normalnie uruchamiam po wywołaniu ajax, i działa dobrze. Do celów testowych nie potrzebowałem wywołania ajax i zauważyłem, że wyzwalacz nie zadziała, chyba że dam minutę na 5ms. Oto działający i nie działający przykład. Spust migawki nie działa bez opóźnienia w init

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! 

to będzie działać::

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) 

Czy możesz wyjaśnić, dlaczego to nie działa bez zwłoki i powinno

Nie przykład działa? Czy to błąd, czy coś, czego nie rozumiem.

Odpowiedz

5

Dzieje się tak, ponieważ składniki pobierają pustą tablicę z getInitialState i dzieje się to po wywołaniu trigger.

init jest wywoływana podczas tworzenia instancji magazynu, co oznacza, że ​​wyzwalacz w fetchThreads zostaje wywołany bezpośrednio przed zamontowaniem komponentu. Kiedy później słuchany komponent zostanie zamontowany, zamiast niego pobierze pustą tablicę ze sklepu pod adresem getInitialState.

sugeruję następujące zmiany:

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 ;-) 
Powiązane problemy