2012-11-13 3 views
1

J'essaye d'obtenir la bibliothèque de Step.js fonctionnant correctement avec le café-manuscrit. Je suis tout à fait nouveau pour le café, mais voici ma tentative:Step.js et flux de contrôle asynchrone avec CoffeeScript

setTimeout(
    => 
    console.log("step 1 at #{new Date}") 
    setTimeout(
     => 
     console.log("step 2 at #{new Date}") 
     setTimeout(
      => 
      console.log("step 3 at #{new Date}") 
      10000 
     ) 
     10000 
    ) 
    10000 
) 

# step 1 at Tue Nov 13 2012 13:18:51 GMT-0600 (CST) 
# step 2 at Tue Nov 13 2012 13:19:01 GMT-0600 (CST) 
# step 3 at Tue Nov 13 2012 13:19:11 GMT-0600 (CST) 

devrait être le même que:

step(
    -> 
    setTimeout(
     => 
     console.log("step 1 at #{new Date}") 
     this(null) 
     10000 
    ) 
    -> 
    setTimeout(
     => 
     console.log("step 2 at #{new Date}") 
     this(null) 
     10000 
    ) 
    -> 
    setTimeout(
     => 
     console.log("step 3 at #{new Date}") 
     this(null) 
     10000 
    ) 
) 

# step 1 at Tue Nov 13 2012 13:12:04 GMT-0600 (CST) 
# step 2 at Tue Nov 13 2012 13:12:04 GMT-0600 (CST) 
# step 3 at Tue Nov 13 2012 13:12:04 GMT-0600 (CST) 

Comme vous pouvez le voir dans l'étape d'exemple ci-dessus exécute toutes les étapes en même temps au lieu de les faire un à la fois comme il est censé le faire. Je ne suis pas trop sûr de savoir pourquoi c'est maintenant.

Répondre

2

CoffeeScript ajoute implicitement un return devant la dernière expression d'une fonction. C'est un problème avec Step, qui suppose que si vous renvoyez quelque chose, cette étape est synchrone.

La solution est d'ajouter un return explicite à la fin de chaque fonction de l'étape:

step(
    -> 
    setTimeout(
     => 
     console.log("step 1 at #{new Date}") 
     this(null) 
     10000 
    ) 
    return 
    -> 
    setTimeout(
     => 
     console.log("step 2 at #{new Date}") 
     this(null) 
     10000 
    ) 
    return 
    -> 
    setTimeout(
     => 
     console.log("step 3 at #{new Date}") 
     this(null) 
     10000 
    ) 
    return 
) 
+0

Merci vous me devança;). J'aime tes retours sans valeur indéfinie c'est plus propre. Je vais le marquer comme la réponse –

0

figured it out. Donc, puisque le café a des déclarations de retour implicites, il retournera la valeur de la dernière déclaration (ou expression si vous voulez). La bibliothèque Step suppose que lorsque vous renvoyez une valeur explicite à partir de la fonction, vous effectuez une progression synchrone (facilitant le mélange et la correspondance des opérations de synchronisation et d'asynchrone). Cela fonctionne très bien dans Javascript, où nous avons des déclarations de retour explicites.

Une solution est de revenir toujours définie:

step(
    -> 
    setTimeout(
     => 
     console.log("step 1 at #{new Date}") 
     this(null) 
     10000 
    ) 
    return undefined 
    -> 
    setTimeout(
     => 
     console.log("step 2 at #{new Date}") 
     this(null) 
     10000 
    ) 
    return undefined 
    -> 
    setTimeout(
     => 
     console.log("step 3 at #{new Date}") 
     this(null) 
     10000 
    ) 
    return undefined 
) 

# step 1 at Tue Nov 13 2012 13:38:51 GMT-0600 (CST) 
# step 2 at Tue Nov 13 2012 13:39:01 GMT-0600 (CST) 
# step 3 at Tue Nov 13 2012 13:39:11 GMT-0600 (CST)