1

我目前正在使用 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
  )
4

2 回答 2

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
  )
于 2013-01-30T17:26:25.460 回答
1

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

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

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

高温高压

于 2015-04-01T02:12:07.097 回答