【问题标题】:Q.all doesn't call tasksQ.all 不调用任务
【发布时间】:2015-01-25 16:06:06
【问题描述】:

所以我有这个 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和2。

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

怎么了?

【问题讨论】:

    标签: node.js coffeescript q


    【解决方案1】:

    Q.all helper 期望解析一个数组或 promise,而不是函数数组。这意味着如果你想使用Q.all,你应该自己调用所有的任务。

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

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

    【讨论】:

    • 啊,就这么简单。我应该自己解决这个问题,谢谢!关于这个的一个小问题:为什么这适用于@task1 和@task2 中的范围?事实上,在这些函数中我可以使用@风格的调用很好。但是为什么即使没有粗箭头,上下文也能正确绑定呢?
    • @Atmocreations 因为您在constructor 的上下文中同步执行它们,所以将生成的承诺传递给Q.all
    猜你喜欢
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多