2016-11-22 6 views
8

私はthis articleを読んでいたのですが、最初のスニペットではなぜseconde wait()が最初のwait()を待っていたのですが、2番目のスニペットでは2つwait() asyncを実行しますか?あなたの最初の関数でJavaScriptはいつ実際に待っていますか?

async function series() { 
    await wait(500); 
    await wait(500); 
    return "done!"; 
} 

async function parallel() { 
    const wait1 = wait(500); 
    const wait2 = wait(500); 
    await wait1; 
    await wait2; 
    return "done!"; 
} 

function wait(ms) { 
    return new Promise(r => setTimeout(r, ms)); 
} 
+2

あなたはそれを呼び出すときにwait()を開始します。 「シリーズ」では、それを呼び出してそれを待ってから呼び出し、もう一度それを待ちます。 "並列"では、一度に2つのwait()を呼び出し、次にそれらを待っています。だから両方が同時に始まった。 –

+0

@korvenは 'const wait1 = wait(500);' 'const wait2 = wait(500);の前にこの' setTimeout'を既に開始してはいけません。 '実行されますか? – Blake

+0

なぜ私は決して「やらない」! 'series()'や 'parallel()'を実行しているときにFirefoxコンソールにログを記録しますか? – Marecky

答えて

6

async function series() { 
    await wait(500); // 1 
    await wait(500); // 2 
    return "done!"; 
} 

あなたは、すぐにそれが始まっていますように、第1のwaitを待つためにJSを言っています。
これは最初の1が終了する前に、第2 wait(500)は、起動することはできません意味:

  1. トリガーwait(500) // 1
を渡すことを待つ
  • トリガーwait(500) // 2
  • に合格するために、そのための待ち時間を

    第2の関数:

    async function parallel() { 
        const wait1 = wait(500); // 1 
        const wait2 = wait(500); // 2 
        await wait1; 
        await wait2; 
        return "done!"; 
    } 
    

    は、が呼び出されてから、結果を待つように指示されています。

    1. トリガーwait(500) // 1
    2. トリガーwait(500) // 2
    3. wait1が通過するのを待ち、

    ためwait1wait2が互いの直後にトリガされwait2が通過するのを待ち、彼らがしています実際には並行して動作します。

    この想像:2人が、あなたは、各ストップウォッチが10秒に達する前に待機する必要がある場合、あなたはまだわずか10秒を待たなければならない、同時にストップウォッチを開始し、両方の場合

    を。
    一方、series関数では、最初のストップウォッチが終了する前に2番目のストップウォッチを開始することはできません。

  • +0

    はconstではありません。wait1 = wait(500); const wait2 = wait(500)の前にすでにこのsetTimeoutを開始してください。実行される? – Blake

    +0

    @Blake:_Start_、はい。まず、 'wait1'が開始されますが、' wait1'が完了するのを待ってから、 'parallel2'で' wait2'が始まります。 – Cerbrus

    +0

    ありがとう! 'setTimeout'の定義を再確認しただけで、settimeintervalと混在しているようです。 – Blake

    -2

    2つのタスクが従属している場合は、非同期タスクに依存します。私。最初のタスクが完了するのを待ちます。最初のスニペットでも同じことが起こっているため、完了までに約1000msかかるのです。

    しかし、2つのタスクが独立している場合、それらを並列に実行して、従属タスクの前にそれらのタスクを待つことができます。私。 2番目のスニペットの場合、両方のタスクの結果が必要な場合があり、次にこれらの結果を操作します。だから、私たちはreturn文の前に待っているのです。

    C#async-awaitメカニズムに似ています。参考のためにAsynchronous Programming with async and await

    +2

    なぜC#のドキュメントにリンクしていますか? – Cerbrus

    +0

    @Cerbrus私は、非同期待機のための同様のメカニズムを持っているので、概念のためにC#ドキュメントにリンクしています。 – Zeeshan

    +0

    @Cerbrus私の答えのコンセプトの部分をあなたの答えと比較すると、それは同じ意味を伝えています。なぜ私の答えが落選したのか分かりません。 – Zeeshan

    関連する問題