如果没有延迟初始化,回流触发器将无法工作

Posted

技术标签:

【中文标题】如果没有延迟初始化,回流触发器将无法工作【英文标题】:Reflux trigger won't work without a delay in init 【发布时间】:2015-06-01 06:03:55 【问题描述】:

我使用 Reflux,通常我在进行 ajax 调用后触发,并且效果很好。出于测试目的,我不需要 ajax 调用,并且我注意到除非我给出 5 毫秒的超时时间,否则触发器将不起作用。这是工作和不工作的例子。

不工作的例子:

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!

这将起作用:

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)

你能解释一下为什么它不能立即工作吗?应该这样做吗?这是一个错误还是我不明白的东西。

【问题讨论】:

【参考方案1】:

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

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

我建议进行以下更改:

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 ;-)

【讨论】:

以上是关于如果没有延迟初始化,回流触发器将无法工作的主要内容,如果未能解决你的问题,请参考以下文章

LazyInitializationException: 延迟初始化角色集合失败 无法初始化代理 - 没有会话

无法延迟初始化角色集合:myapp.myapp.models.Contact.messages,无法初始化代理 - 没有会话

未能延迟初始化角色集合:无法初始化代理 - Hibernate 中的 @ManyToMany 映射注释中没有会话错误? [复制]

休眠延迟加载不适用于 Spring Boot => 无法延迟初始化角色集合无法初始化代理 - 无会话

无法写入内容:无法延迟初始化角色集合,无法初始化代理 - 无会话

Phonegap 插件延迟初始化