2

私は JS にワークフローを持っています。これは、setTimeout 関数によって設定されたいくつかのセットを 1 つずつ実行する必要があります。できれば簡単で美しい方法で、これを JS/jQuery でどのように行うことができますか?

このように見えます

function recursiveOne(arg1){
  if (allRight) return;

  doSomething();
  andAnotherOne();
  setTimeout(function(){recursiveOne(arg1)}, 3000);
}

function coreFunction(){
  recursiveOne(arg1);
  recursiveTwo(arg2);
  recursiveThree(arg3);
}

ここで、recursiveTwo は、recursiveOne がすでに最後の反復を行っている場合にのみ開始する必要があります。

悪い点は、バックエンドからの反応を待つ必要があり、それを直接受け取ることができなかったため、すべての関数が setTimeout を介して機能することです。HTML ソースによってのみです。

私が見ることができる可能な解決策:

  • 次の関数のコールバックは、前の関数で正しく渡されました。クールすぎない。
  • jQuery defered オブジェクト。これもそれほど美しくはありませんが、少しだけ優れています。欠点は、この方法で使用したい各関数で追加の遅延リクエストを発生させる必要があることです。
4

2 に答える 2

4

関数をコールバックとして送信する必要があります

function recursiveOne(arg1, callback){
  if (allRight) callback();

  doSomething();
  andAnotherOne();
  setTimeout(function(){recursiveOne(arg1, callback)}, 3000);
}


function coreFunction(){
    recursiveOne(arg1, function(){
        recursiveTwo(arg2)
    });

}

(補足)非同期処理を行うときに、このプロジェクトが大いに役立ったことを覚えています。

https://github.com/caolan/async

于 2012-10-11T12:29:41.903 に答える
1

コールバックを使用するか、直接呼び出す必要がありますcoreFunction。以下では、関数の配列を使用してそれを行う方法を見つけることができます。

function recursiveOne(arg1){
   if(arg1 < 5){
      arg1++;
      setTimeout(function(){recursiveOne(arg1);}, 500);
   }else{
      console.log("func1 complete");
      coreFunction();
   }
}

function recursiveTwo(arg1){
   if(arg1 < 10){
      arg1++;
      setTimeout(function(){recursiveTwo(arg1);}, 500);
   }else{
      console.log("func2 complete");
      coreFunction();
   }
}

function recursiveThree(arg1){
    if(arg1 < 20){
      arg1++;
      setTimeout(function(){recursiveThree(arg1);}, 500);
   }else{
      console.log("func3 complete");
      coreFunction();
   }
} 

var funcSet = [recursiveOne, recursiveTwo, recursiveThree];
var funcArgs = [[1], [5], [10]];

function coreFunction(){
   if(funcSet.length){
       var func = funcSet.shift();
       func.apply(window, funcArgs.shift())
   }
}
coreFunction();
于 2012-10-11T12:49:53.240 に答える