我目前正在使用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
)
答案 0 :(得分:1)
squares
是同步执行的,因此在绑定任何侦听器之前调用deferred.notify
和deferred.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