【问题标题】:Q.js progress handler doesn't seem to be firingQ.js 进度处理程序似乎没有触发
【发布时间】:2013-01-13 08:31:25
【问题描述】:

我目前将 Q.js 用于 Promise,因为它们实现了进度处理程序。然而,他们似乎并没有开火。我究竟做错了什么?它看起来很基本,所以我一定遗漏了一些东西。 (下面的例子是用coffeescript写的)

Q = require('q')
squares = (list) ->
  deferred = Q.defer()
  result = list.map (e) ->
    r = e * e
    deferred.notify(r)
    return r
  deferred.resolve(result)
  return deferred.promise

squares([1,2,3,4,5,6,7,8,9,10])
  .then((result) ->
    console.log result
  ).progress((e) ->
    console.log e
  )

【问题讨论】:

    标签: javascript coffeescript promise q


    【解决方案1】:

    squares 是同步执行的,因此deferred.notifydeferred.resolve 在绑定任何侦听器之前被调用。似乎已经实现的承诺仍然调用 fulfilled 回调,但没有任何 progress 回调。您可以使用setTimeout 包装部分代码,如下所示:

    Q = require('q')
    
    squares = (list) ->
      deferred = Q.defer()
      setTimeout (->
        result = list.map (e) ->
          r = e * e
          deferred.notify(r)
          return r
        deferred.resolve(result)
        ), 0
      return deferred.promise
    
    squares([1,2,3,4,5,6,7,8,9,10])
      .progress((e) ->
        console.log e
      ).then((result) ->
        console.log result
      )
    

    【讨论】:

      【解决方案2】:

      github 上的这个讨论帖:OP 和包维护者之间的https://github.com/kriskowal/q/issues/188 提供了详细的解释和解决方案。

      总而言之,监听器必须通过调用.progress 来注册,然后承诺方调用.notify。这意味着在注册.progress 侦听器之前可能会出现承诺者同步调用通知的示例,因此该示例将出现故障。 @bennedich 提供的 addTimeout 解决方案满足了这个要求。

      此排序要求与通过调用.then 注册的侦听器的体验不一致 在承诺者调用.resolve 之后。在这种情况下,尽管排序,仍会调用侦听器。但是要在之后调用该侦听器,Q 包必须执行 magic(请参阅戴巫师帽的人:https://github.com/kriskowal)。故意不为.progress 的听众提供相同的魔法,因此在这个和以前的答案中提到了排序要求。

      HTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-26
        • 2012-02-14
        相关资源
        最近更新 更多