2017-04-23 15 views
0

私は以下のforループのためにこの関数を使用するいくつかの関数を持っています。forループの部分をjavacriptの関数に置きます。

function startClaw(dir){ 
    var readCount = 0; 
    for(var isRead in qdata){ 
     readCount++; 
     if(qdata[isRead]['reading'] == true){ 
      return; 
     }else if(readCount == 5){ 
      isAnimating = $("#claw").is(':animated'); 
      if(!isAnimating){// prevents multiple clicks during animation 
       if(isMoving || isDropping){ return; } 
       MCI = setInterval(function(){ moveClaw(dir); },10); 
       //console.log("startClaw:" + dir); 
       stopSwingClaw();  
      } 
     } 
    } 
} 
//................................................................. 
function dropClaw(){ 
    var readCount = 0; 
    for(var isRead in qdata){ 
     readCount++; 
     if(qdata[isRead]['reading'] == true){ 
      return; 
     }else if(readCount == 5){ 
      if(isDropping){ return; } //prevent multiple clicks 
      stopSwingClaw(); 
      isDropping = true; 
      MCI = setInterval(moveDown,20); //start heartbeat 
     } 
    } 
} 

else ifステートメントの内容は、さまざまな機能によって異なります。私は、else ifの外側のforループの「部分」をその独自の機能に配置する方法があるかどうか疑問に思っています。私はこれを見たか、これをずっと前にやったような気がしますが、それは私を逃れてしまい、例は見つけられませんでした。みんな、ありがとう!

+0

確かに、どのようにそれらのさまざまな機能で実際に行う必要があるかによって異なります。 –

+0

私はたぶん 'for-in'ループを使ってflakを捕まえることに気付きました。シーケンシャルに実行するのではなく、意図的に配列オブジェクトを反復処理します。私のコードで使用している場合は問題ありません。 – Jester

+0

ここでは分かりません – charlietfl

答えて

1

プレビュー、これは上記と似ています。 2つの違いは、if文で異なるチェックをする必要がある場合にカウントが関数に渡され、ループから戻ったように見えるので、戻り値が何であるかをチェックしています。条件が満たされます。コメントには以下のコードの注釈があります。

function startClaw(dir) { 
    // Pass a function as a callback to the method which expects to receive the count as a param 
    doReadCount(qdata, function(theCount) { 
    if (theCount === 5) { 
     isAnimating = $("#claw").is(':animated'); 
     if (!isAnimating) { // prevents multiple clicks during animation 
     if (isMoving || isDropping) { 
      return true; 
     } 
     MCI = setInterval(function() { moveClaw(dir); }, 10); 
     //console.log("startClaw:" + dir); 
     stopSwingClaw(); 
     } 

     return false; 
    }); 
} 
//................................................................. 
function dropClaw() { 
    // Pass a function as a callback to the method which expects to receive the count as a param 
    doReadCount(qdata, function(theCount) { 
    if (theCount === 5) { 
     if (isDropping) { 
     return; 
     } //prevent multiple clicks 

     stopSwingClaw(); 
     isDropping = true; 
     MCI = setInterval(moveDown,20); //start heartbeat 
    } 
    }); 
} 

function doReadCount(qdata, elseFunction) { 
    var readCount = 0; 
    var elseReturn; 
    for (var isRead in qdata) { 
     readCount++; 
     if (qdata[isRead]['reading'] == true) { 
       return; 
     } else { 
     // call the function that was sent and pass it the current read count. If the return is true, then also return true here 
     elseReturn = elseFunction(readCount); 
     if (elseReturn) { 
      return; 
     } 
     } 
    } 
    } 
+0

を参照してくださいAhはい!コールバック関数はまさに私が探していたものです。これはそれを清潔に保ち、依然として必要な仕事を得ます。ありがとう、トン!私は真剣に数年(私は忘れてしまったので、ジャバスクリプトを使用する)コールバック関数を作っていなかった。 – Jester

1

これを達成するために関数を別の関数に渡すことができます。私はdropClawのためにそれをやったし、私の例からも明らかにする必要がありますstartClawを抽出する。

function operateClaw(func){ 
    var readCount = 0; 
    for(var isRead in qdata){ 
     readCount++; 
     if(qdata[isRead]['reading'] == true){ 
      return; 
     }else if(readCount == 5){ 
      func(); 
     } 
    } 
} 

function drop() { 
    if(isDropping){ return; } //prevent multiple clicks 
    stopSwingClaw(); 
    isDropping = true; 
    MCI = setInterval(moveDown,20); //start heartbeat 
} 

function dropClaw() { 
    operateClaw(drop); 
} 
関連する問題