for await ・・・ of ・・・構文の利用を検討するのもありかもしれません。
以下は簡単に試すコードです。HTTPリクエストにaxios、データの取得元にjsonplaceholderの GET /users/:id を使っています。
main.js
javascript
1import axios from 'axios';
2
3const sleep = waitTime => new Promise(resolve => setTimeout(resolve, waitTime));
4
5const fetchMember = (id) =>
6 axios(`https://jsonplaceholder.typicode.com/users/${id}`).then(res => res.data);
7
8async function* fetchMembersGen(ids) {
9 for (let i=0; i < ids.length; ++i) {
10 yield await fetchMember(ids[i]);
11 }
12}
13
14for await (const m of fetchMembersGen([1, 2, 3])) {
15 console.log(m.id, m.name);
16 await sleep(1000);
17}
18
package.json
json
1{
2 "dependencies": {
3 "axios": "^1.0.0"
4 },
5 "type": "module"
6}
7
yarn install
node main.js
1 Leanne Graham
2 Ervin Howell
3 Clementine Bauch
追記
上記の回答コードに対する修正です。次のリクエストまでに一秒間待つPromiseのawaitをジェネレータ関数のほうに移動し、かつ最後のリクエスト完了後には1秒待たないようにします。
diff
1 async function* fetchMembersGen(ids) {
2 for (let i=0; i < ids.length; ++i) {
3 yield await fetchMember(ids[i]);
4+ if (i < ids.length - 1) {
5+ await sleep(1000);
6+ }
7 }
8 }
9
10 for await (const m of fetchMembersGen([1, 2, 3])) {
11 console.log(m.id, m.name);
12- await sleep(1000);
13 }
14
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/05 06:29