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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

2回答

6179閲覧

JavaSctiptのPromise、thenが想定通りに動きません

AkikoS

総合スコア11

JavaScript

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

0グッド

0クリップ

投稿2016/09/11 06:41

###前提・実現したいこと
JavaScriptの勉強を始めたばかりなのですが、
Promiseのthenで躓いています。

下記ソースコードを実行した際に、
process1実行→500ms後にthenが発動しprocess2が実行
とされるものと思っていたのですが、
実際は
procsee2→process1の順に実行されてしまいます。

thenの使用方法が間違っているのだと思いますが、
なぜprocess1→procsee2の順番に実行されないのかわかりません。

setTimeOutがそれぞれ非同期で実行され,
process2の方が待ち時間が短いため、先に実行終了するのだと思いますが、
thenはそれをprocess1→2の順で実行してくれるのだと思っていました。

下記のソースコードの誤りと、
どうすれば想定した挙動になるかを教えて頂けないでしょうか。

よろしくお願いします。

JavaScript

1function process1() { 2 return new Promise(function(resolve, reject){ 3 setTimeout(function(){ 4 console.log("process1"); 5 resolve(); 6 }, 500); 7 }); 8} 9 10function process2() { 11 return new Promise(function(resolve, reject){ 12 setTimeout(function(){ 13 console.log("process2"); 14 resolve(); 15 }, 200); 16 }); 17} 18 19function test() { 20 process1().then(process2()); 21} 22 23>process2 24 process1

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

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

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

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

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

guest

回答2

0

ベストアンサー

process1().then(process2);
これで期待通り動くようにおもいます

補足
.then(process2()) としちゃうと、process2()の戻り値が、process1()のコールバック関数実行後に実行(?)されるのだと思います。
他の言語だとthen()に渡す値の型が適正じゃない(関数じゃない)時点でエラーになるものもあるかと思いますが、javascriptはその辺りアバウトに許容しますから、嵌ったら原因究明が難しかったりしますね。

投稿2016/09/11 07:32

編集2016/09/11 07:40
hirohiro

総合スコア2068

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

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

AkikoS

2016/09/11 07:49

なんと。。ありがとうございます!解決しました。
AkikoS

2016/09/11 07:51

はい、その通りです。一日嵌ってしまいました。。。 投稿してよかったです。本当にありがとうございます。
guest

0

setTimeoutは「Xms後に処理の実行を予約する」という機能です。

javascript

1process1().then(process2());

この記述だと「500ms後にconsole出力する」という処理を予約し終わったら「200ms後にconsole出力する」という処理を予約する、という処理をしたことになります。
TVの録画予約と放映時間の関係に似てますかね。
process1の実行後にprocess2を実行しようとするならこんな感じでしょうか。

javascript

1function process1() { 2 return new Promise(function(resolve, reject){ 3 setTimeout(function(){ 4 console.log("process1"); 5 process2(); 6 resolve(); 7 }, 500); 8 }); 9} 10function process2() { 11 return new Promise(function(resolve, reject){ 12 setTimeout(function(){ 13 console.log("process2"); 14 resolve(); 15 }, 200); 16 }); 17} 18function test(){ 19 process1(); 20} 21

投稿2016/09/11 07:09

編集2016/09/11 07:17
tkturbo

総合スコア5572

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

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

AkikoS

2016/09/11 07:58

setTimeOutの説明ありがとうございます! 予約した時点でresolveされちゃったら困るなぁと思ったのですが、 そもそもthenの後のfunctionの指定方法が間違っていたようでした。。。 少しずつ覚えていきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問