首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反流触发器不会在没有延迟的情况下工作。

反流触发器不会在没有延迟的情况下工作。
EN

Stack Overflow用户
提问于 2015-03-27 19:24:22
回答 1查看 769关注 0票数 6

我使用反流,通常是在发出ajax调用之后触发,并且运行良好。出于测试目的,我不需要ajax调用,并且我注意到,除非我给出至少5ms的超时时间,否则触发器不会工作。这里是工作的例子,而不是工作的例子。

不起作用的例子:

代码语言:javascript
复制
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!

这将起作用:

代码语言:javascript
复制
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)

你能解释一下为什么它不能立即工作吗?应该吗?是窃听器还是什么我不明白的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-01 06:41:24

这是因为组件从getInitialState获取空数组,并且在调用trigger之后发生。

在创建存储实例时调用init,这意味着在安装组件之前立即调用fetchThreads中的触发器。稍后,当侦听组件被挂载时,它将从getInitialState上的存储中获取空数组。

我建议作以下修改:

代码语言:javascript
复制
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 ;-)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29308672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档