回答編集履歴

1

補足

2022/08/31 20:27

投稿

退会済みユーザー
test CHANGED
@@ -98,3 +98,52 @@
98
98
 
99
99
  (※ 上記のコードを試す際に、一度に大量のリクエストをdummyimage.comに送らないようご配慮願います)
100
100
 
101
+
102
+ ### 追記
103
+
104
+ 上記のコードでは、Promise.any() を使うことで`low`以上`high`以下のバージョンのURLで画像をロードできるかどうか、複数のリクエストを同時にサーバーに投げますが、そうではなく最小のバージョン番号のURLから順にひとつずつロードできるかを試して、最初にロードに成功したバージョン番号が見つかったところでテストを終了するというコードにしたいのであれば、方法として async ジェネレータと `for await ... of` の組み合わせが考えられます。
105
+
106
+ その場合、先のコードの **main.js** を以下のようにします。
107
+
108
+ ```javascript
109
+ document.addEventListener('DOMContentLoaded', async function() {
110
+ let availableVersion = 0;
111
+
112
+ for await (const { available, imageVersion } of versionTester(80, 90)) {
113
+ if (available) {
114
+ availableVersion = imageVersion;
115
+ break;
116
+ }
117
+ }
118
+
119
+ document.getElementById('result').textContent = `${availableVersion || '不明'}`;
120
+ });
121
+
122
+
123
+ async function* versionTester(low, high) {
124
+ const baseUrl = 'https://dummyimage.com/100{VER}100/000/fff.jpg';
125
+ let imageVersion = low;
126
+
127
+ while (imageVersion <= high) {
128
+ const result = await new Promise(resolve => {
129
+ const src = baseUrl.replace('{VER}', String.fromCharCode(imageVersion));
130
+ const img = document.createElement('img');
131
+ img.onload = function() {
132
+ resolve({ imageVersion, available: true });
133
+ }
134
+ img.onerror = function() {
135
+ resolve({ imageVersion, available: false });
136
+ }
137
+ img.src = src;
138
+ });
139
+
140
+ yield result;
141
+ imageVersion ++;
142
+ }
143
+ }
144
+ ````
145
+
146
+ このコードでは `versionTester(low, high)` というasyncジェネレータ関数を作り、これの返すasyncジェネレータを `for await ... of`構文で各非同期処理の結果を取得し、有効なバージョン番号がみつかった時点で break で抜けるようにしています。
147
+
148
+
149
+