web-dev-qa-db-ja.com

JavaScriptでは、ループ内でawaitを使用するとループがブロックされますか?

次のループを見てください。

_for(var i=0; i<100; ++i){
    let result = await some_slow_async_function();
    do_something_with_result();
}
_
  1. awaitはループをブロックしますか?または、iawaitingしている間、引き続き増加しますか?

  2. do_something_with_result()の順序は、iに関してシーケンシャルですか?それとも、awaited関数が各iに対してどれだけ高速かによって異なりますか?

59
smorgs

これはこの興味深い質問についての私のテストソリューションです:

import crypto from "crypto";

function diyCrypto() {
    return new Promise((resolve, reject) => {
        crypto.pbkdf2('secret', 'salt', 2000000, 64, 'sha512', (err, res) => {
            if (err) {
                reject(err)
                return 
            }
            resolve(res.toString("base64"))
        })
    })
}

setTimeout(async () => {
    console.log("before await...")
    const a = await diyCrypto();
    console.log("after await...", a)
}, 0);

setInterval(() => {
    console.log("test....")
}, 200);

SetTimeoutのコールバック内では、awaitが実行をブロックします。ただし、setIntervalは引き続き実行されるため、イベントループは通常どおり実行されます。

0
Chris Bao