Q.all 不调用任务



所以我有这个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
    )

这实际上可以正常工作,但这不是我想要的。目标是并行启动任务 1 和 2。

旁注:在任务中,我希望能够将@用于Main的成员变量

怎么了?

Q.all帮助程序期望解析一个数组或承诺,而不是一个函数数组。这意味着如果要使用 Q.all,您应该自己调用所有任务。

在您的示例中,删除匿名函数包装将解决问题:

constructor: () ->
  Q.all([
    @task1()
    @task2()
  ]).then (results) ->
    // Success
  .catch (error) ->
    // Error

相关内容

  • 没有找到相关文章

最新更新