node.js - tutorial - Q.todo no llama a tareas
npm install (1)
Q.all
ayudante espera una matriz o promete resolverla, no una matriz de funciones. Significa que debe llamar a todas sus tareas usted mismo si quiere usar Q.all
.
En su ejemplo, eliminar las envolturas anónimas de la función hará el truco:
constructor: () ->
Q.all([
@task1()
@task2()
]).then (results) ->
// Success
.catch (error) ->
// Error
Así que tengo este CoffeeScript (simplificado para centrarse en el problema real)
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()
El resultado es:
results
[ [Function], [Function] ]
En Main::constructor
, callbacks @task1
y @task2
no parecen ser llamados. Para estar seguro de esto, he agregado console.log
en la parte superior de ambos. Y como no se imprimen, puedo estar seguro de que no los llaman.
Para fines de prueba, reemplacé este bloque
constructor: () ->
Q.all([
=> @task1(),
=> @task2()])
.then (results)->
console.log ''results''
console.log results
.catch((error)->
console.log ''error''
console.log error
)
por este bloque
constructor: () ->
Q.fcall () => @task1()
.then () => @task2()
.then (results)->
console.log ''results''
console.log results
.catch((error)->
console.log ''error''
console.log error
)
y esto realmente funciona como se espera, pero no es lo que quiero. El objetivo es comenzar las tareas 1 y 2 en paralelo.
Nota al margen: dentro de las tareas, me gustaría poder usar @
para las variables miembro de Main
¿Qué pasa?