1

ダミーの状況で私の問題を説明しましょう。次のコードを考えてみましょう:

var counter = 0;    
function increase(){
    if(counter < 10){
        counter++;
        setTimeout(increase, 100);
    }
}

increase()ここでの考え方は、関数がジョブを終了したらカウンター値を表示することです。これを試してみましょう:

increase();
alert(counter);

おそらくご存知のとおり、機能しません。呼び出しは 10 ではなく 1 を表示します。関数がインクリメントの仕事を完全に終了したらalert()、値を表示したいと思います。counter

私の問題を解決する簡単な方法はありますか?

[注]increase()コールバック関数を使用することはオプションではありません。完了後に何かを実行したいということを知り たくないからです(モジュール化の目的で)。したがって、次のようなことは避けたいと思います。

function increaseForTheKings(f){
    if(counter < 10){
        counter++;
        setTimeout(function(){ increase(f); }, 100);
    } else {
       f();
    }
}
4

2 に答える 2

3

これを行う標準的な方法は、promisesを使用することです。

var counter = 0;
function increase(){
  var d = jQuery.Deferred();
  var doIncrease = function() {
    if(counter < 10){
        counter++;
        setTimeout(doIncrease, 100);
    } else {
      d.resolve();
    }
  };
  doIncrease();
  return d.promise();
};

increase().then(function() {
  alert(counter);
});
于 2013-09-04T23:43:41.067 に答える