Q.all不调用任务(Q.all doesn't call tasks)

2019-10-21 08:23发布

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

这实际上可以作为espected,但它不是我想要的。 我们的目标是启动并行任务1和2。

附注:里面的任务,我想能够使用@为成员变量Main

怎么了?

Answer 1:

Q.all帮手预计数组或承诺来解决,而不是功能的阵列。 这意味着你应该自己打电话给所有的任务,如果你想使用Q.all

在你的榜样,消除匿名函数包装材料将这样的伎俩:

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


文章来源: Q.all doesn't call tasks