2012-11-13 77 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)