LoginSignup
0
0

More than 5 years have passed since last update.

Deferredの状態保持?

Last updated at Posted at 2017-02-22

Deferredの状態保持

//状態保持
// 高速でクリックされても、1秒ごとにしかappend()を実行しない
var prevState = new $.Deferred().resolve().promise();

function asyncFuncDef(){
  var deferred = new $.Deferred();
  setTimeout(function(){
    deferred.resolve();
  },1000);
  return deferred.promise();
}
$(document).on('click',function(){
  //最初はappend()が直ぐ実行される
  //asyncFuncDefの結果がprevStateに代入される(1秒立つまでpending)
  //もう一回クリックされたらasyncFuncDefの状態を見る
  //状態がresolveだとthen()が実行される
  //何回も素早くクリックされると、then()が押した分だけキューされる
  //resolveが帰ってきたらキューされたものが一個ずつ実行される
  prevState = prevState.then(function(){
    $('body').append('<p>hoge</p>');
    return asyncFuncDef();
  });
});

コメントは私が追記したものです。
Deferredの状態保持って紹介されてたけど、いまいち流れがつかめない。
素早くクリックされた場合は、代入が実行されずにthen()がキューされて、キューされたものがそれぞれresolve待ちになる。resolveに成ったらasyncFuncDef()の結果(1秒立つまでpendeing)が、prevSateに代入されて、次にキューされてるものがresolveを待つ。。。っていう流れであってるのかな?

動きは以下で確認してください!

See the Pen PpYGZj by 坂本龍太 (@sakamoto-ryouta) on CodePen.


スパゲッティな文章ですね!
あってるか教えてくださいすごい人!!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0