回答編集履歴

4

ウェブワーカーを使ったコードの追加

2024/10/02 00:47

投稿

juner
juner

スコア437

test CHANGED
@@ -63,3 +63,50 @@
63
63
  もしも 完全並行処理を行いたいのであればウェブワーカー API をお試しください
64
64
 
65
65
  https://developer.mozilla.org/ja/docs/Web/API/Worker
66
+
67
+ 追伸3:
68
+
69
+ ウェブワーカーAPIを使ったコードも書いておきます。
70
+
71
+ ```js
72
+ var func1 = async function () {
73
+ console.log("func1()が実行されました。");
74
+ };
75
+
76
+ var func2 = async function () {
77
+ const source = `
78
+ globalThis.addEventListener('message', ({data}) => {
79
+ for(var i = 0, j = 0; i < data; i++){
80
+ j = i;
81
+ }
82
+ globalThis.postMessage(i);
83
+ })
84
+ `;
85
+
86
+ const url = `data:text/javascript;base64,${btoa(source)}`;
87
+ const {promise, resolve, reject} = Promise.withResolvers();
88
+ const worker = new Worker(url);
89
+ worker.addEventListener('error', reject);
90
+ worker.addEventListener('messageerror', reject);
91
+ worker.addEventListener('message', ({data}) => resolve(data));
92
+ worker.postMessage(100000000);
93
+ const i = await promise;
94
+ return new Promise((resolve) => {
95
+ console.log("func2()が実行されました。i = " + i);
96
+ resolve();
97
+ });
98
+ };
99
+
100
+ var func3 = async function () {
101
+ console.log("func3()が実行されました。");
102
+ };
103
+ (async () => {
104
+ await Promise.all([
105
+ func1(), // func1を待つ
106
+ func2(), // func2を待つ
107
+ func3(), // func3を待つ
108
+ ]);
109
+ })();
110
+ ```
111
+
112
+ [playground](https://runjs.co/s/1sopu1cFi)

3

ウェブワーカーAPIについて追記

2024/10/01 07:53

投稿

juner
juner

スコア437

test CHANGED
@@ -56,3 +56,10 @@
56
56
  console.log("func2()が実行されました。i = " + i);
57
57
  };
58
58
  ```
59
+
60
+ 追伸2:
61
+
62
+ javascript のメインスレッドは シングルスレッドです。この方法は await でキューに分けることで 処理を分割して並行で動作している様に見える方法なので
63
+ もしも 完全並行処理を行いたいのであればウェブワーカー API をお試しください
64
+
65
+ https://developer.mozilla.org/ja/docs/Web/API/Worker

2

他の func の先頭に `await Promise.resolve()` を入れたならば の func2 のコードを追加

2024/10/01 05:59

投稿

juner
juner

スコア437

test CHANGED
@@ -40,3 +40,19 @@
40
40
  https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
41
41
 
42
42
  https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
43
+
44
+ 追伸:
45
+
46
+ もしもそれぞれの func の先頭に `await Promise.resolve()` するのであれば `func2` は次の様にした方がいいかもしれません。
47
+
48
+
49
+ ```js
50
+ var func2 = async function(){
51
+ await Promise.resolve();
52
+ for(var i = 0, j = 0; i < 100000000; i++){
53
+ j = i;
54
+ await Promise.resolve();
55
+ }
56
+ console.log("func2()が実行されました。i = " + i);
57
+ };
58
+ ```

1

Promise.prototype.then を参考リンクに追加(いわゆる await するとこれが実行される

2024/10/01 02:27

投稿

juner
juner

スコア437

test CHANGED
@@ -38,3 +38,5 @@
38
38
  https://developer.mozilla.org/ja/docs/Web/API/Window/queueMicrotask
39
39
 
40
40
  https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function
41
+
42
+ https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/then