所以我有这个CoffeeScript(简化为专注于真正的问题)
Q = require 'q'
events = require 'events'
class SomeObj extends events.EventEmitter
constructor: () ->
setTimeout () =>
@emit 'done'
, 3000
class SomeObj2 extends events.EventEmitter
constructor: () ->
setTimeout () =>
@emit 'done'
, 50000
class Main
someObj1: null
someObj2: null
constructor: () ->
Q.all([
=> @task1(),
=> @task2()])
.then (results)->
console.log 'results'
console.log results
.catch((error)->
console.log 'error'
console.log error
)
task1: () ->
console.log 'task1 started'
defer = Q.defer()
@someObj = new SomeObj()
@someObj.on 'done', (err, data) =>
console.log 'task1 done'
defer.resolve data
return defer.promise
task2: () ->
console.log 'task2 started'
defer = Q.defer()
@someObj2 = new SomeObj2()
@someObj2.on 'done', (err, data) =>
console.log 'task2 done'
defer.resolve data
return defer.promise
main = new Main()
输出结果为:
results
[ [Function], [Function] ]
在Main::constructor
中,回调@task1
和@task2
似乎无法被调用。所以为了确保这一点,我已经在它们的顶部添加了console.log
。由于他们没有打印出来,我可以肯定他们没有被打电话。
出于测试目的,我替换了这个块
constructor: () ->
Q.all([
=> @task1(),
=> @task2()])
.then (results)->
console.log 'results'
console.log results
.catch((error)->
console.log 'error'
console.log error
)
通过这个块
constructor: () ->
Q.fcall () => @task1()
.then () => @task2()
.then (results)->
console.log 'results'
console.log results
.catch((error)->
console.log 'error'
console.log error
)
这实际上是有效的,但它并不是我想要的。目标是并行启动task1和。
附注:在任务内部,我希望能够将@
用于Main
的成员变量
出了什么问题?
答案 0 :(得分:1)
Q.all
helper期望解析数组或promise,而不是函数数组。这意味着如果您想使用Q.all
,则应自行调用所有任务。
在您的示例中,删除匿名函数包装将起到作用:
constructor: () ->
Q.all([
@task1()
@task2()
]).then (results) ->
// Success
.catch (error) ->
// Error