Q.js进度处理程序似乎没有被触发

时间:2013-01-29 17:20:17

标签: javascript coffeescript promise q

我目前正在使用Q.js进行承诺,因为它们实现了进度处理程序。但是,看起来他们并没有开火。我究竟做错了什么?这看起来非常基本,所以我必须遗漏一些东西。 (以下示例以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
  )

2 个答案:

答案 0 :(得分: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
  )

答案 1 :(得分:1)

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

总之,在提示者拨打.progress之前,必须通过致电.notify来注册听众。这意味着promiser同步调用notify的示例可能会在.progress侦听器注册之前发生,因此示例将显示为已损坏。 @bennedich提供的addTimeout解决方案满足了这一要求。

此订购要求与在承诺商调用.then后通过致电.resolve 注册的受众群体的体验不一致。在这种情况下,尽管有订单,仍然会调用监听器。但是对于之后调用的侦听器,Q包必须执行 magic (请参阅向导中的人:https://github.com/kriskowal)。故意没有为.progress的听众提供相同的魔法,因此在此答案和之前的答案中提到了排序要求。

HTH