回答編集履歴
1
補足
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
|
+
|