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

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

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

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

JavaScript

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

Q&A

解決済

2回答

6352閲覧

JavaScript Promise、ネストするPromiseのより良い書き方

bleurouge

総合スコア161

Node.js

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

JavaScript

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

1グッド

2クリップ

投稿2015/12/13 05:43

編集2015/12/23 16:22

下記リンクの記事(君は複数のPromiseをネストする)を読んで、少し疑問点がありましたのでこちらで
質問してみました。下記のコードの場合、.allを使うことにより、よりシンプルに記述できることは分かります。

Promiseアンチパターン

▼疑問点
外側のPromiseの結果を内側のPromiseで利用する必要がある場合はこのアンチパターンになるのか?
それとも、何かしら良い記述方法があるのか? を知りたいです。よろしくお願いします。

javascript

1//##記事アンチパターン 2loadSomething().then(function(something) { 3 loadAnotherthing().then(function(another) { 4 DoSomethingOnThem(something, another); 5 }); 6}); 7 8//##記事修正コード 9q.all([loadSomething(), loadAnotherThing()]) 10 .spread(function(something, another) { 11 DoSomethingOnThem(something, another); 12}); 13 14//##【質問】外側のPromiseの結果を内側のPromise loadAnotherthingの引数として利用し、 15// 処理対象(targetB)を処理したい 16var targetA; //処理対象A 17var targetB; //処理対象B 1819loadSomething(targetA).then(function(something) { 20 loadAnotherthing(targetB, something).then(function(another) { 21 DoSomethingOnThem(another); 22 }); 23}); 24
AyaMorisawa👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

js

1//##【質問】外側のPromiseの結果を内側のPromise loadAnotherthingの引数として利用し、 2// 処理対象(targetB)を処理したい 3var targetA; //処理対象A 4var targetB; //処理対象B 5 6loadSomething(targetA).then(function(something) { 7 loadAnotherthing(targetB, something).then(function(another) { 8 DoSomethingOnThem(another); 9 }); 10});

js

1var targetA; 2var targetB; 3 4loadSomething(targetA) 5.then(loadAnotherthing.bind(null, targetB)) 6.then(DoSomethingOnThem);

投稿2015/12/22 13:39

編集2015/12/23 16:32
AyaMorisawa

総合スコア26

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

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

bleurouge

2015/12/23 16:26

ごもっともですorz ご回答ありがとうございます。 そもそも質問に出したコードに不備がありそもそもの意図がまったく伝わらない内容となっていました。 質問を修正しました。
AyaMorisawa

2015/12/23 16:31

回答を更新しました。
bleurouge

2015/12/24 03:00

回答ありがとうございました。 Promiseのネスト以前にそもそものJavaScriptの使い方の話に帰結しました。こういうケースでさっと.bindで引数を固定するという解に行き着けない点、だめですね... 今回のケースについてはもう忘れることはないと思います。ありがとうございました。 ▼.bind(null, targetB) 箇所について参考 Javascriptのbind関数と部分適用>その2:引数を予約する http://qiita.com/hosomichi/items/e11ad0c4ea79db2dee84#%E3%81%9D%E3%81%AE2%E5%BC%95%E6%95%B0%E3%82%92%E4%BA%88%E7%B4%84%E3%81%99%E3%82%8B
guest

0

海外サイトまわってみたら同様の質問がありました。自己回答です。

--harmony やQなどのモジュールを使わない場合のケースです。少し見通しが良くなったのでしょうか?
直感的ではなくなったけど、ネストは解消しました。慣れなのかな、分かりにくような気も。。。

正しい答えはないのかもしれませんが、他にも良い方法がありましたら回答いただければ幸いです。

javascript

1//##【質問】外側のPromiseの結果を内側のPromise loadAnotherthingの引数として利用し、 2// 処理対象(targetB)を処理したい 3var targetA; //処理対象A 4var targetB; //処理対象B 56loadSomething(targetA).then(function(something) { 7 loadAnotherthing(targetB, something).then(function(another) { 8 DoSomethingOnThem(another); 9 }); 10}); 11 12//##少し見通しが良くなった??? 13var targetA; //処理対象A 14var targetB; //処理対象B 1516var loadStg = loadSomething(targetA); 17var loadAntng = loadStg.then(function(something) { 18 return loadAnotherthing(targetB, something); 19}); 20 21loadAntng.then(function(another) { 22 DoSomethingOnThem(another); 23}); 24

_

▼参考
Aren't promises just callbacks?
How do I access previous promise results in a .then() chain?

投稿2015/12/13 06:24

編集2015/12/23 16:30
bleurouge

総合スコア161

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問