2012-11-13 37 views
1

我想让step.js库与coffee-script正常工作。我很新的咖啡,但这里是我的尝试:Step.js和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) 

应该是一样的:

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) 

正如你可以从上面的例子步骤执行所有步骤在同一时间看到而不是像它应该那样一次一个地做它们。我不太清楚为什么这是现在。

回答

2

CoffeeScript在函数的最后一个表达式前隐式添加return。这是Step的问题,它假定如果你返回任何东西,那么这个步骤是同步的。

解决的办法是在每个步骤函数的末尾添加一个显式return

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

谢谢你打我吧)。我喜欢你的回报没有未定义的价值,它更干净。我会将其标记为答案 –

0

了它。所以,因为咖啡有隐含的返回语句,它将返回最后一个语句的值(或者如果你愿意的话)。 Step库假定当你从函数中返回一个明确的值时,你正在做同步步进(使混合和匹配同步和异步操作更容易)。这在JavaScript中非常有用,我们有显式的返回语句。

一种解决方法是始终返回未定义:

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)