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

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

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

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

JavaScript

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

Q&A

解決済

2回答

2016閲覧

Node.jsでforEachの扱い方について

rera

総合スコア109

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2017/03/31 07:53

Javascript

1module.exports.getNumbers = userId => new Promise((resolve, reject) => { 2 knex 3 .select('*') 4 .from('Users') 5 .where('user_id', userId) 6 .then(rows => { 7 console.log('1'); 8 let a = _.forEach(rows, (val, key) => { 9 return new Promise((resolve) => { 10 if (val.number === 1) { 11 console.log('2'); 12 s3Get('all', userId) 13 .then(arrKey => { 14 arrKeys = arrKey; 15 console.log('3'); 16 resolve(); 17 console.log('4'); 18 }); 19 } 20 }) 21 }, resolve()); 22 23 Promise.all(a).then(() => { 24 console.log('5'); 25 resolve('ok'); 26 }) 27 }) 28});

上記のコードを実行すると
console.log1 2 5 3 4の順番で実行されてしまいます。
1 2 3 4 5と順番に実行するにはどうしたらよいのでしょうか...。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ちょっといろいろ複雑なので確かめていませんがこんな感じで Promise の中で return すると良いと思います。

js

1module.exports.getNumbers = userId => new Promise((resolve, reject) => { 2 return knex.select('*') 3 .from('Users') 4 .where('user_id', userId) 5 .then(rows => { 6 console.log('1'); 7 return Promise.all( 8 _.map(rows, (val, key) => { 9 return new Promise((resolve) => { 10 if (val.number !== 1) { 11 resolve(); 12 return; 13 } 14 console.log('2'); 15 16 // これを待つ必要がある 17 return s3Get('all', userId).then(arrKey => { 18 const arrKeys = arrKey; 19 console.log('3'); 20 resolve(); 21 console.log('4'); 22 }); 23 }); 24 }) 25 ); 26 }).then((resolve) => { 27 console.log('5'); 28 resolve(); 29 }); 30});

投稿2017/03/31 19:05

chitoku

総合スコア1610

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

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

0

forEachにco-rega-foreachを使うと良いかもしれません。

自分用の co-foreach を作った話 - 3846masa's memo

・・・coを使って良いのなら、ですが。

投稿2017/03/31 14:58

編集2017/03/31 15:08
mao999

総合スコア111

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問