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

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

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

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

Q&A

解決済

1回答

664閲覧

Promise.all(iterable)のiterableをpromiseにしたほうがいい理由

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

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

0グッド

1クリップ

投稿2019/10/24 15:02

編集2019/10/24 15:06

Promise.all()リファレンス
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

説明に
「Promise.all(iterable) メソッドは単一の Promise を返し、これは引数 iterable の中のすべての Promise が解決されるか、引数 iterable の中に Promise がない場合に解決されます。」
と書かれてありました。
一般的にはnew Promiseの返り値をPromise.all(iterable) のiterableの要素として渡すみたいなのですが説明文を読むとpromiseを渡さなくても良いような感じだったので、渡さない場合も試してみました。
すると結果は同じようにiterableの要素の処理が全て終わるのを待ってからthen以降を処理してくれているように思えました。
今の所わざわざpromiseにしなくても普通に処理を配列にし、Promise.allの引数に入れておけばまとめて処理をしてくれるのでそれでいいような気がするのですが、しないといけない場合、しなくてもいいのであればしたほうがいい理由というのは何があるのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

すると結果は同じようにiterableの要素の処理が全て終わるのを待ってからthen以降を処理してくれているように思えました。

そうはなりません。

javascript

1function sleep(){ 2 new Promise(resolve => { setTimeout(() => console.log('sleep () resolve'), 1000) }); 3} 4 5Promise.all([sleep(), sleep()]).then(() => console.log('Promise.all resolved'))

このようなコードを書くと、Promise.all resolvedのほうが先に出力されます。

投稿2019/10/24 23:02

maisumakun

総合スコア145121

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

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

退会済みユーザー

退会済みユーザー

2019/10/25 02:37

ご回答ありがとうございます var array = [ ]; //空の配列 for (let 配列の一つ of 配列){ array.push(connection.query('INSERT INTO テーブル SET ?', 配列の一つ)); }; Promise.all(array).then(() => { connection.end();//mysql切断 }); 試しにinsert文の配列を作りpromise.allに入れ、全てのinsertが終わった後にmysqlを切断するのようなコードを書いてみた所、insertが終わった後切断がちゃんとされていたのですがmysqlの例とご回答いただいた例はどうして結果が異なるのでしょうか?
maisumakun

2019/10/25 02:42 編集

connection.end()自体が、もともと実行中のクエリを待つ仕様になっています。以下の例では、Promiseすら挟まずにconnection.end()を実行していますが、それでも途中切断にはなりません。 https://github.com/mysqljs/mysql#introduction
退会済みユーザー

退会済みユーザー

2019/10/25 02:44

endがそういう仕様だっただけだったのですね! ありがとうございます。理解ができました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問