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

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

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

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

Q&A

解決済

4回答

1438閲覧

【JavaScript】Promiseについて

hirosnow

総合スコア16

JavaScript

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

0グッド

2クリップ

投稿2019/05/23 03:00

超初歩的な質問をさせていただきます。
非同期処理の勉強をしておりまして、Promise関数のところで混乱しております。
自分なりの解釈をしてみたのですが、あっているかどうか教えていただけますと幸いです。
(勉強になるページ等教えていただければそちらを参考にして勉強します。)

混乱しているところ

promiseについての記事を読んでいて

JavaSctipt

1var taskA = new Promise(function(resolve, reject) { 2 setTimeout(function () { 3 console.log('taskA'); 4 resolve(); //なんで実行されんねん 5 }, 16); 6});

4行目のresolveが実行される意味が分からない
→なんで'resolve'という関数が定義されとんねん
というところで混乱しております。

自分なりの解釈

例えば

JavaScript

1(function(){ 2 const result = function(a,b,num) { 3 if(num > 0 ){ 4 a(); 5 }else{ 6 b(); 7 } 8 } 9 10 const a = function(){ 11 console.log('aだよー'); 12 } 13 14 const b = function(){ 15 console.log('bだよー'); 16 } 17 18 result(a, b, 10);//結果は'aだよー' 19 20}())

といった関数を考えてみると
1.'result'という関数を定義する
2.'a'と'b'という関数を定義する
3.'result'という関数を実行する
という順番になります。
これを少し書き換えると

JavaScript

1(function(){ 2 const result = function(resolve, reject) { 3 setTimeout(function () { 4 resolve(); 5 }, 16); 6 } 7 8 const resolve = function(){ 9 console.log('aだよー'); 10 } 11 12 const reject = function(){ 13 console.log('bだよー'); 14 } 15 16 result(resolve, reject);//結果は'aだよー' 17 18}())

という構文が出来上がりました。
ここで先ほどの'Promise'関数に当てはめてみると

JavaScript

1Promise(function(resolve, reject) { 2 setTimeout(function () { 3 console.log('taskA'); 4 resolve(); 5 }, 16); 6}); 7 8//と書かれた文は 9 10function Promise(func){ 11 12 const result = func(); 13 /** 14 const result = function(resolve, reject) { 15 setTimeout(function () { 16 console.log('taskA'); 17 resolve(); 18 }, 16); 19 } 20 **/ 21 22 const resolve = function(){ 23 //処理内容 24 } 25 26 const reject = function(){ 27 //処理内容 28 } 29 30 result(resolve, reject); 31 32}

と書き換えることができる
だから実行することができるのだ
と解釈しております。

いかがでしょうか。
皆様のご意見頂けますと嬉しいです。

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

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

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

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

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

guest

回答4

0

JavaScript

1result(a, b, 10);//結果は'aだよー'

resultとa,bの位置が逆です。
問題のコードでは、関数resultに実引数がありません。


Promiseを使わないコードを書けば、自ずと分かります。

JavaScript

1function promiseCallback (resolve, reject) { 2 setTimeout(function () { 3 console.log('taskA'); 4 resolve(); //なんで実行されんねん 5 } 6} 7 8function resolve () { 9 console.log('success'); 10} 11 12function reject { 13 console.log('error'); 14} 15 16// Promiseを使わない場合 17promiseCallback(resolve, reject); 18 19// Promiseを使う場合 20new Promise(promiseCallback).then(resolve).catch(reject);

Promiseはコールバック関数を駆使して、完了(then)を検知しています。
正確に理解するには、PromiseのPolyfillコードを想定する必要がありますが、Promiseを使わないコールバック関数型コードを組んでみることである程度は理解が進むのではないかと思います。

Re: hirosnow さん

投稿2019/05/23 04:06

think49

総合スコア18162

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

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

hirosnow

2019/05/23 04:18

コールバック関数が肝となっているのですね。 理解していたつもりですが、教えていただいた内容を見ても分からない箇所があるので 参考となるサイトを見ながら、組んでみて理解度を深めたいと思います。 ありがとうございました。
think49

2019/05/23 09:59

https://azu.github.io/promises-book/ のようなサイトを探していた、ということですが、『JavaScript Promiseの本』はPromiseの内部動作までは説明していませんので、質問者さんの求める答えは得られないと思います。 質問内容と解決内容が対応していないように思います。知りたかったのは「なぜ動くのか」ではなく、「どうやって使うのか」だったのでしょうか。 それから、『JavaScript Promiseの本』は掲示されていた https://qiita.com/toshihirock/items/e49b66f8685a8510bd76 からリングされていましたので、ご存じないとは思っていませんでした。
hirosnow

2019/05/27 04:39

コメント遅くなってしまい申し訳ございません。 >質問内容と解決内容が対応していないように思います。知りたかったのは「なぜ動くのか」ではなく、「どうやって使うのか」だったのでしょうか。 「なぜ動くのか」というのが、知りたかったです。 ただ、その前にpromiseの使い方やコールバック関数について総合的に記述されているサイトも同時に知りたかったです。 (Promiseやコールバック関数についての理解が浅いためか、誤解を招くような書き方をしてしまい申し訳ありません。) >それから、『JavaScript Promiseの本』は掲示されていた https://qiita.com/toshihirock/items/e49b66f8685a8510bd76 からリングされていましたので、ご存じないとは思っていませんでした。 見落としておりました。 これからはきちんと確認をしてから、こちらへ質問をするよう気を付けます。 ご丁寧にコメントをいただきましてありがとうございました。
guest

0

ベストアンサー

JavaScript Promiseの本という
有名なサイト(無料の電子書籍)がありますので
こちらを読めばご理解いただけるかと思います。
http://azu.github.io/promises-book/

投稿2019/05/23 03:59

yasutomi

総合スコア2937

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

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

hirosnow

2019/05/23 04:15

このようなサイトを探しておりました! 教えていただきありがとうございます。
guest

0

単純にPromiseのコールバックの第1引数に与えた変数名を実行することで
非同期処理の同期作業ルーチンに進むというだけでは?

仮に

javascript

1var taskA = new Promise(function(resolve, reject) { 2 setTimeout(function () { 3 console.log("doing A"); 4 resolve("done A"); 5 }, 30); 6}); 7var taskB = new Promise(function(resolve, reject) { 8 setTimeout(function () { 9 console.log("doing B"); 10 resolve("done B"); 11 }, 10); 12}); 13var taskC = new Promise(function(resolve, reject) { 14 setTimeout(function () { 15 console.log("doing C"); 16 resolve("done C"); 17 }, 20); 18}); 19(async function(){ 20console.log('start'); 21await Promise.all([taskA,taskB,taskC]).then(function(ret){ 22 console.log(ret); 23}); 24console.log('end'); 25})()

を実行すると、結果

start doing B doing C doing A Array(3) [ "done A", "done B", "done C" ] end

となりますが、上記仮にresolve("done C")をコメントアウトすると
後ろに流れないので

start doing B doing C doing A

までで処理が止まってしまいます

投稿2019/05/23 03:23

yambejp

総合スコア114784

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

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

yambejp

2019/05/23 03:25

イメージ的にはaddEventListenerのコールバックの第1引数が イベントを渡すような感じですかね・・・むしろわかりにくいか
hirosnow

2019/05/23 04:09

ソースまで書いていただき、ありがとうございます。 私の質問の意図としては'resolve'はどこも渡していないのに、どうして実行されるのだろう といった点です。(日本語がおかしいかもしれませんが・・・) イメージ的には何となく理解できました。 しっかり理解できるように他の方のサイトも参考にして勉強を進めたいと思います。 ありがとうございました。
yambejp

2019/05/23 04:23

> 'resolve'はどこも渡していないのに、どうして実行されるのだろう むしろ逆ですね、resolveは任意に実行しないとpromiseが完了しない resolveという名前はPromiseの第1引数で渡す という話です。 正確にはリゾルバとリジェクタなのでresolver,rejectorと書いた方が より認識しやすいでしょう(逆にhoge,fugaでもなんでもいい)
hirosnow

2019/05/23 04:31

ありがとうございます! すごい腹落ちしました! >むしろ逆ですね、resolveは任意に実行しないとpromiseが完了しない 実行しないとpromiseが完了しないという考え方がありませんでした。 本当にありがとうございます。
guest

0

投稿2019/05/23 03:16

mar-kn

総合スコア306

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

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

hirosnow

2019/05/23 04:15

サイトを教えていただき、ありがとうございます。 実装を確認して、挙動を理解できるように勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問