1

Step.jsライブラリをcoffee-scriptで正しく動作させようとしています。私はコーヒーにまったく慣れていませんが、ここに私の試みがあります:

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)

上記の例からわかるように、ステップは、想定されているように一度に1つずつ実行するのではなく、すべてのステップを同時に実行しています。なぜ今なのかよくわかりません。

4

2 に答える 2

2

CoffeeScriptreturnは、関数の最後の式の前に暗黙的にを追加します。これは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
)
于 2012-11-13T19:41:38.947 に答える
0

理解した。したがって、コーヒーには暗黙のreturnステートメントがあるため、最後のステートメントの値(または必要に応じて式)が返されます。ステップライブラリは、関数から明示的な値を返すときに、同期ステッピングを実行していることを前提としています(同期操作と非同期操作を簡単に組み合わせることができます)。これは、明示的なreturnステートメントがある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)
于 2012-11-13T19:43:23.357 に答える