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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1629閲覧

jQueryのPromiseのdoneについて、説明します。間違っている所を教えて頂けますでしょうか?

fjaiofjawiefjaw

総合スコア210

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/03/01 17:37

スキルアップのため、jqueryのソースコードを読んでいます。
今から、done関数に渡した関数がなぜ、Deferred.resolveによって
実行されるか説明しますので、
認識違いの部分を教えて頂けますでしょうか。

全体のソースコードです。

javascript

1const logWhenResolved = () => console.log('resolvedで実行'); 2const promise = delayHello(); 3promise.done(logWhenResolved); 4/** 5 * 1秒後にHello!を出力するDeferred対応関数。必ずresolveする 6 * 7 * @returns Promise 8 */ 9function delayHello() 10{ 11 const d = new $.Deferred; 12 setTimeout(function(){ 13 console.log('Hello!'); 14 d.resolve(); 15 }, 1000); 16 return d.promise(); 17}

以下、私の説明です。荒削りな知識のため、間違いが多々あるかもしれません。

delayHello関数内の

javascript

1const d = new $.Deferred; 2//省略 3return d.promise();

によってjQuery.Deferredオブジェクトをインスタンス化して変数dに入れる。
変数d内のpromiseオブジェクトを返す。
※promiseオブジェクトは、主にstateを返す関数とthen関数を持つもの。

javascript

1promise.done(logWhenResolved);

によって、logWhenResolvedを状態resolveに対応した
jQuery.Callbacks( "once memory" )に追加している。

一秒後、delayHello関数内の

javascript

1d.resolve();

によって、先ほどのjQuery.CallbacksのfireWith関数が
実行され、logWhenResolvedが実行される。

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

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

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

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

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

guest

回答1

0

ベストアンサー

const promise = delayHello();

promise.done(logWhenResolved);

$.Deferredのpromiseに対してdoneをするとaddするような処理のようですね
ただ、jQueryを利用するなら$.whenの方が一般的だとおもいます

javascript

1 2function logWhenResolved(){console.log('resolvedで実行');} 3$.when(delayHello()).done(function(){ 4 logWhenResolved(); 5});

参考

ちなみにちゃんとしたPromise処理にはjQueryは不要

javascript

1var p1= new Promise(function(resolve){setTimeout(function(){console.log(3);return resolve()},300);}); 2var p2= new Promise(function(resolve){setTimeout(function(){console.log(1);return resolve()},100);}); 3var p3= new Promise(function(resolve){setTimeout(function(){console.log(2);return resolve()},200);}); 4Promise.all([p1,p2,p3]).then(function(){console.log(4);});

※ただしIEはpromiseに対応していないので、IEを利用する可能性がある場合には
このライブラリを先に読み込んで下さい

javascript

1<script src="https://www.promisejs.org/polyfills/promise-6.1.0.min.js"></script>

投稿2018/03/02 01:41

編集2018/03/02 08:44
yambejp

総合スコア114583

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

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

fjaiofjawiefjaw

2018/03/02 04:23

回答ありがとうございます。 利用目的というか、ソースコードを読んで、スキルアップを図っております。 しかしながら、whenが一般的とのことで、そちらも視野に入れて読解していきます。
fjaiofjawiefjaw

2018/03/02 04:26

Whenに関しては、アドバイスとしてでしたね。 失礼しました。 前コメントの反論は、無しでお願いします。
fjaiofjawiefjaw

2018/03/02 18:58

そう言われれば、es6にもpromiseがありましたね。 気付きませんでした。 promiseの本という楽しそうなものを見つけられて、良かったです。 jqueryソースコードのそれと軽く、比較してみます。 質問して、良かったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問