未解決のプロミスオブジェクトがあったとします。そのオブジェクトに対して同時に複数回Promise.resolveを呼び出した場合の挙動について、競合せず安全か、そして解決後の挙動は確定的かどうかが質問です。
Chromeでテストしたところ競合は起きず、またプロミスの実行は一度だけで、resolveを呼び出した順にthenが実行されているように見えます。
これはPromiseの言語仕様上当然のことですか?複数回呼び出した時のインタプリタ内部の処理の流れを教えてください。例えばPromise.resolveはpにコールバックを登録するような動きなのでしょうか。解決後は登録された順にCBを呼び出しているのだとすれば、競合が起きないのは説明がつきそうです。
実験
次のように非同期の関数を定義して実験しました。http://localhost:8081はマルチスレッドのウェブサーバーで複数のリクエストを同時に処理することが出来ます。ただし、レスポンスに5秒かかるように細工がしてあります。目的は複数の同時アクセスがあるのかの検証です。
JavaScript
1async function main() { 2 var p = fetch('http://localhost:8081'); 3 console.log(p); 4 Promise.resolve(p).then((r)=>console.log(1, r.status)); 5 console.log(p); 6 Promise.resolve(p).then((r)=>console.log(2, r.status)); 7 console.log(p); 8 Promise.resolve(p).then((r)=>console.log(3, r.status)); 9}
実行します
JavaScript
1await main()
結果
Promise {<pending>} Promise {<pending>} Promise {<pending>} # 5秒経ったのち 1 200 2 200 3 200
サーバー側のログには1行だけアクセス記録がありました。
$ ./server.py Starting server, use <Ctrl-C> to stop sleep 5 127.0.0.1 - - [17/Jun/2020 21:51:22] "GET / HTTP/1.1" 200 -
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/18 05:48
退会済みユーザー
2020/06/18 06:06