質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

659閲覧

Nodejsでの同期処理

Sosupe1123

総合スコア66

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/10/04 23:01

前提

APiリクエストを複数実行する時に一度にたくさんのリクエストを送って制限がかからないようにしたい。

実現したいこと

await Promise.allで中にmap化したものを入れてやったがうまくいかなかった

発生している問題・エラーメッセージ

該当のソースコード

JavaScript

1const sleep = waitTime => new Promise(resolve => setTimeout(resolve, waitTime)); 2 3 4const all = await g.members.fetch(); 5await Promise.all(all.map(async m => { 6 console.log("request"); 7 request(); 8 await sleep(1000); 9}));

試したこと

1秒ごとにrequestと表示されていくことを期待していたがやっぱりうまくいかなかった。おそらく何かが違う気がします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

Promiseを順次実行したいのであれば、forfor-infor-ofでもOK)のループ内でPromiseを作ってawaitしていくのが一番手っ取り早いです。

Promiseは作成した瞬間にスタートするので、Promise.allを使っても引数を渡す時点ですべてのPromiseが動き出しています。Promise.allは、引数のPromiseが全部resolveした瞬間を拾う、という役割の関数です。

投稿2022/10/04 23:11

編集2022/10/04 23:23
maisumakun

総合スコア145201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sosupe1123

2022/10/05 06:29

ありがとうございます!無事に順次実行できました.
guest

0

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 01:41

編集2022/10/05 02:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

サンプルプログラム

js

1const sleep = waitTime => new Promise(resolve => setTimeout(resolve, waitTime)); 2 3async function main(all) { 4 for (const m of all) { 5 console.log("request", m); 6 await sleep(1000); 7 } 8} 9 10main([1, 2, 3, 'ダー']);

投稿2022/10/05 00:12

shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問