課題の背景
開発の際、promiseの挙動がどうしても分からず、自分でpromiseを作って挙動をテストしました。
質問内容
パターン①③:なぜこの実行結果になるかわかりません。
パターン④⑤:awaitの位置による違いはなんですか?
パターン⑥:もっといい書き方ありますか?
6つのコード
共通部分
js
1const hoge = [1, 2, 3, 4, 5]; 2 3const myPromise = () => { 4 return new Promise((resolve) => { 5 resolve("foo"); 6 }); 7}; 8 9console.log("start"); 10 11/// 該当箇所 12 13console.log("end");
パターン①
js
1hoge.forEach(async (element) => { 2 await myPromise().then((res) => { 3 console.log(res); 4 }); 5 console.log(element); 6});
js
1// 実行結果 2start 3end 4foo 5foo 6foo 7foo 8foo 91 102 113 124 135
js
1// 意図した実行結果 2start 3foo 41 5foo 62 7foo 83 9foo 104 11foo 125 13end
パターン②
js
1for (const element of hoge) { 2 myPromise().then((res) => { 3 console.log(res); 4 }); 5 console.log(element); 6}
js
1// 実行結果(意図通り) 2start 31 42 53 64 75 8end 9foo 10foo 11foo 12foo 13foo
パターン③
js
1for (const element of hoge) { 2 myPromise() 3 .then((res) => { 4 console.log(res); 5 }) 6 .then(() => { 7 console.log(element); 8 }); 9}
js
1// 実行結果 2start 3end 4foo 5foo 6foo 7foo 8foo 91 102 113 124 135
js
1// 意図した実行結果 2start 3end 4foo 51 6foo 72 8foo 93 10foo 114 12foo 135
パターン④
js
1(async () => { 2 for (const element of hoge) { 3 await myPromise() 4 .then((res) => { 5 console.log(res); 6 }) 7 .then(() => { 8 console.log(element); 9 }); 10 } 11})();
js
1// 実行結果(意図通り?コールバック関数?) 2start 3end 4foo 51 6foo 72 8foo 93 10foo 114 12foo 135
パターン⑤
js
1(async () => { 2 for await (const element of hoge) { 3 myPromise() 4 .then((res) => { 5 console.log(res); 6 }) 7 .then(() => { 8 console.log(element); 9 }); 10 } 11})();
js
1// 実行結果(パターン④との違いが分からない) 2start 3end 4foo 51 6foo 72 8foo 93 10foo 114 12foo 135
パターン⑥
js
1const fuga = async () => { 2 for (const element of hoge) { 3 await myPromise() 4 .then((res) => { 5 console.log(res); 6 }) 7 .then(() => { 8 console.log(element); 9 }); 10 } 11}; 12 13fuga().then(() => { 14 console.log("end"); 15});
js
1// 実行結果(一番欲しかった結果) 2start 3foo 41 5foo 62 7foo 83 9foo 104 11foo 125 13end
実行環境
node.js v12
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/31 02:04