2017-03-08 9 views
0

私は過去2週間にわたって解決された問題を解決しようとしていましたが、うまくいけば誰かが私を正しい方向に向けることができます。Javascriptでは、条件が満たされるまでどのくらいの繰り返しの実行を止めることができますか

私は、JSとjQueryをxmlロジック条件とアクションとともに使用する単一ページアプリケーションを持っています。

JSが関数を非同期で動作させることは可能ですが、私は問題を解決する必要があります。

ユーザーが要素をクリックすると、jsはxmlを通過し、要素IDに関連するノードを検出し、条件セットが満たされているかどうかをチェックし、関連するアクションを起動します。 XMLのスニペットは以下の通りです。

<block id="10000005" triggerID="125"> 
    <ConditionsAndActions name="Default" setIndex="0"> 
    <Conditions> 
    </Conditions> 
    <Actions> 
    <Action actionIndex="0" type="AskForConfirmation" message="Are you sure?"/> 
    <Action actionIndex="0" type="NewRecord" /> 
    </Actions> 
    </ConditionsAndActions> 
</block> 

abioveは、ユーザーが確認ボタン、プロセス手動録画機能をクリックした場合は、「#のbtn125は」その後、火災AskForConfirmation機能をクリックしたときに示します。

アクションはループによってトラバースされ、AskForConfirmationではユーザーが確認応答を返すか、ユーザーが否定応答を返すか、30秒間が経過してループが放棄されるまで、ループを停止する必要があります。

私は変数を使って次のアクションを成功させることなく制御しようとしましたが、これが実現可能であればasync/awaitの周りに頭を浮かべることはできません。

以下に、アクションファイアリングループを示します。

function triggerActions(callType, tags, iC1, iC2, iC3, iC4) { 
    for (var iA1 = 0; iA1 < tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes.length; iA1++) { 
     if (tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].nodeName === "Actions") { 
      for (var iA2 = 0; iA2 < tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes.length; iA2++) { 
       if ($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("type") !== null) { 
        switch ($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("type")) { 
         case "ChangeVisibility": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : ' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("element") + ' visibility amended.'); 
          } 
          eval('$("#' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("element") + '").' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].chidNodes[iA1].childNodes[iA2]).attr("effect") + '();'); 
          break; 
         case "commentBox": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Comment box for ' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("name") + ' found in configuration'); 
           loggingAction('log','comment log'); 
          } 
          break; 
         case "DisplayAlert": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Lightbox stating: ' + variableConversion(($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("message"))) + ' output'); 
          } 
          var alertMessage = '<h2 class="text-center">ALERT:</h2><p class="text-center">' + variableConversion(($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("message"))) + '</p>'; 
          $.colorbox({ 
           html: alertMessage 
          }); 
          $('#cboxContent').removeClass('errorMessage'); 
          break; 
         case "DataQuery": 
          if (debugMode && (($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("destination")).length !== 0)) { 
           destination = '{{' + ($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("destination")) + '}}'; 
           loggingAction('log','NOTIFICATION : Data Query initiated with destination = "' + destination + '", destinationControl = "' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("destinationControl") + '",query number = "' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("queryNumber") + '", parameters ="' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("parameters") + ' " and values = "' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("values") + '".'); 
          } 
          getRunQuery($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("destination"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("destinationControl"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("parameters"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("queryNumber"), sessionID); 
          break; 
         case "DataSource": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Data Source Action'); 
          } 
          break; 
         case "DispositionCall": 
          sendDisposition($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("outcome"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("callbackNumber"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("callbackNumberControl"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("callbackTime"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("callbackTimeControl"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("personalCallback"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("returnData")); 
          break; 
         case "GetRecord": 
          var URN = ($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2])).attr("URN"); 
          if (gridValueSelected.length > 0) { 
           URN = gridValueSelected; 
          } 
          if (debugMode) { 
           loggingAction('info','INFORMATION : Get Record request initiated with URN return of "' + URN + '".'); 
          } 
          rid = generateRID(), message = 'type: "GetRecord", RID: ' + rid + ', SID: ' + sessionID + ', URN:"' + URN + '"'; 
          activeRequests.push(rid + ':GetRecord'); 
          socket.send(message); 
          if (debugMode) { 
           loggingAction('info','INFORMATION : Get Record message sent to server "' + message + '".'); 
          } 
          break; 
         case "GoAvailable": 
          if (debugMode) { 
           if (debugMode) { loggingAction('log','NOTIFICATION : Setting Agent status to Available.'); } 
           rid = generateRID(), message = 'type:"GoAvailable",RID:' + rid + ',SID:' + sessionID; 
           serverComms("outbound", message, rid, "GoAvailable"); 
           if (debugMode) { loggingAction('log','NOTIFICATION : Message sent to server - "' + message + '".'); } 
          } 
          break; 
         case "HangUp": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Hang up call requested.'); 
          } 
          $.colorbox({ 
           html: '<h2 class="confirmation text-center">Confirmation:</h2><p class="confirmation text-center">Call hung up.</p>' 
          }); 
          $('#cboxContent').removeClass('errorMessage'); 
          break; 
         case "LogOut": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Agent has requested to Log out of script.'); 
          } 
          logOut(); 
          break; 
         case "MoveToPanel": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Action to Move to Panel #pnl' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("panelID") + ' triggered.'); 
          } 
          var parser = new DOMParser(), 
           xmlLogic = parser.parseFromString(scriptXML, "text/xml"), 
           tags = xmlLogic.getElementsByTagName('*'); 
          $(document).ready(function() { 
           for (var i0 = 1; i0 < tags.length; i0++) { 
            switch (tags[i0].nodeName) { 
             case "Button": 
              updateVariableOutput('#' + $(tags[i0]).attr("id"), $(tags[i0]).attr("name")); 
              break; 
             case "inputField": 
              updateVariableOutput('#' + $(tags[i0]).attr("id"), $(tags[i0]).attr("label")); 
              break; 
             case "textBlock": 
              updateVariableOutput('#' + $(tags[i0]).attr("id"), $(tags[i0]).attr("text")); 
              break; 
            } 
           } 
          }); 
          eval('$("#pnl' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("panelID") + '").parent().children().hide(); $("#pnl' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("panelID") + '").show();'); 
          gridValueSelected = ''; 
          $('.selectedRow').removeClass('selectedRow'); 
          $('table').children().remove(); 
          $('table').removeClass('jsgrid'); 
          break; 
         case "MoveToScriptWindow": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION :Action to Move to Window "#win' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("panelID") + '" has been triggered.'); 
          } 
          eval('$("#win' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("panelID") + '").parent().children().hide(); $("#win' + $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("panelID") + '").show();'); 
          gridValueSelected = ''; 
          $('.selectedRow').removeClass('selectedRow'); 
          $('table').children().remove(); 
          $('table').removeClass('jsgrid'); 
          break; 
         case "OpenBrowserWindow": 
          openNewWindow($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("URL"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("toolbar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("addressBar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("toolbar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("addressBar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("toolbar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("addressBar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("toolbar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("addressBar"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("width"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("height")); 
          if (debugMode) { 
           loggingAction('log','INFORMATION : "' + variableConversion($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("URL")) + '" opened in new window.'); 
          } 
          break; 
         case "SetFieldParameter": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Field Parameter Set'); 
          } 
          break; 
         case "SetTextBox": 
          if (debugMode) { 
           loggingAction('log','NOTIFICATION : Set Text Box Action'); 
          } 
          break; 
         case "SetVariable": 
          if (gridValueSelected !== '') { 
           var variableName = $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("variable") 
           if (debugMode) { 
            loggingAction('log','NOTIFICATION : The variable to have selected grid value associated with it is "' + variableName + '".'); 
           } 
           variableNameSplit = variableName.split('.'); 
           if (debugMode) { 
            loggingAction('info','INFORMATION : The Object to recieve the variable is "' + variableNameSplit[1] + '".'); 
            loggingAction('info','INFORMATION : The key for the variable is "' + variableNameSplit[1] + '".'); 
           } 
           if ((variableNameSplit[0] === 'Script') || (variableNameSplit[0] === 'SCRIPT')) { 
            addScriptVariable(variableNameSplit[1], gridValueSelected); 
           } 
          } else { 
           loggingAction('log','NOTIFICATION : Set Variable Value function initiated.'); 
           if ($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("value") !== '') { 
            var variableName = $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("variable"), 
             variableValue = variableConversion($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("value")); 
            if (debugMode) { 
             loggingAction('log','NOTIFICATION : ' + variableName + ' set to "' + variableValue + '".'); 
            } 
            eval(variableName + '="' + variableValue + '"'); 
           } else if ($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("controlID") !== '') { 
            var variableName = $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("variable"), 
             variableValue = $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("controlID"); 
            variableValue = eval('$("#txt' + variableValue + '").val()'); 
            if (debugMode) { 
             loggingAction('log',' NOTIFICATION : The value of the variable to be passed to ' + variableName + ' is "' + variableValue + '".'); 
            } 
            eval(variableName + '="' + variableValue + '"'); 
           } 
          } 
          break; 
         case "UpdateWebFrame": 
          if (debugMode) { 
           loggingAction('info','INFORMATION : iFrame update initiated to load ' + variableConversion($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("URL")) + '.') 
          } 
          updateIFrame($(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("URL"), $(tags[0].childNodes[iC1].childNodes[iC2].childNodes[iC3].childNodes[iA1].childNodes[iA2]).attr("destinationControl")); 
          break; 
        } 
       } 
      } 
     } 
    } 
} 

私が達成しようとしているものの簡単な例は以下のとおりです。

JS;

var blocker = 'no'; 

function askForConfirmation() { 
    $('#Interaction').fadeIn(); 
} 
function manualRecord() { 
console.log('Request new record')} 
function responseReceived(acknowledgemntValue){ 
    $('#Interaction').fadeOut(); 
} 
$(document).ready(function(){ 
    $('#btn69').click(function(){ 
     askForConfirmation();  
    }); 
    $('#accept').click(function(){ 
     blocker = 'no'; 
     responseReceived(); 
     alert(blocker); 
    }); 
    $('#decline').click(function(){ 
     blocker = 'yes'; 
     responseReceived(); 
     alert(blocker); 
    }); 
}); 

html;

<!DOCTYPE html> 
<head> 
<title>Sandbox</title> 
</head> 
<body> 
    <header> 
     <h2>Sandbox testing</h2> 
    </header> 
    <main> 
     <button id="btn69">Request Manual Record</button> 
     <div id="Interaction" style="display:none;"> 
     <p>Please confirm you wish to create manual record</p> 
     <p><button id="accept">Accept</button><button id="decline">Decline</button></p> 
     </div> 
     <div id="blockerState"></div> 
    </main> 
    <footer> 
     <script src="https://code.jquery.com/jquery-1.12.4.js"></script> 
     <script src="sandscript.js"></script> 
    </footer> 
</body> 
+0

が発火アクション数を追跡し、行動の完了時に更新されたステータスを追跡するカウンタ機構を追加することによって、この問題を除去しますAskForConfirmationスイッチのケースがありません。 –

+0

simpyは変数を 'waiting'に設定し、ライトボックスをポップアップしてyes/noボタンを押してから、ボタンをクリックするか変数を更新するまでsetTimeoutでループするか、または30秒間を過ぎます –

+3

[Minimal、Complete、Verifiable](http://stackoverflow.com/help/mcve)の例を作成するとします。それを作成する行為は、それ自体の助けとなるかもしれません。 – TrueWill

答えて

0

Iは、私は上記のコードを理解次のアクション

+0

これを達成する方法を示すスニペットを提供できますか? https://stackoverflow.com/help/how-to-answer –

0

ループは、これではJavaScript(シングルスレッド言語)文を実行どれだけあるを完了するために(のsetTimeoutのような)非同期操作のために一時停止しません。したがって、ループ内のsetTimeoutは機能しません。

triggerActionsのロジックをforのループに入れている理由は明らかではありませんが、これはボタンクリックの単なる動作であり、おそらくxmlの対応するアクションが1つだけトリガーされるでしょう。

あなたが持っているシナリオやビジネス要件が何であれ、現時点でのシナリオで動作させるには、triggerActionsを以下のように微調整することができます。

ユーザーが特定の条件を待つときにforループを再開するためのインデックスを保存してから、triggerActionsを再度呼び出して、どこからループを再開するかを考えます。

var startIndexOuterLoop, startIndexInnerLoop; //hold the reference of for loop index for the `AskForConfirmation` scenario 
 

 
function triggerActions(params..., resumeMode) { 
 

 
    var iA1, iA2; 
 
    if (resumeMode) { 
 
    iA1 = startIndexOuterLoop; 
 
    iA2 = startIndexInnerLoop; 
 
    } else { 
 
    iA1 = 0; 
 
    iA2 = 
 
    } 
 
    var outerLoopIterateOnce = false; 
 
    for (; i < ...; i++) { 
 
    //reset iA2 to 0 onward, right 
 
    if (outerLoopIterateOnce) { 
 
     iA2 = 0; 
 
    } 
 

 
    outerLoopIterateOnce = true; 
 
    for (; i < ...; i++) { 
 
     // ... statements 
 

 
     if (/*condition for AskForConfirmation */) { 
 
     handleAskForConfirmation(iA1, iA2); 
 
     return; //exit from function 
 
     } 
 

 

 
    } 
 

 
    } 
 

 
} 
 

 
function handleAskForConfirmation(iA1, iA2) { 
 
    startIndexOuterLoop = iA1+1;//1 added so as to continue next iteration 
 
    startIndexInnerLoop = iA2+1; 
 
    // add logic for wait time out etc 
 
    //once thats expired or as per business logic call triggerActions again with one more parameter as true to resume the foor loop indirectly 
 
    triggerActions(params..., true); 
 
}

+0

Amiteshは、正しく理解していれば、配列やオブジェクトを格納してループを終了します。一度準備ができたら、以前は配列やオブジェクトの値を使用していたループ内のポイントを返します。 –

+0

えええええええええええええええええええええええええええええええええんだんこうだんだんだんだんだんだんだんじゅんじゅんじゅんだんじゅんじゅんだんじゅんじゅんようおもしろおかしくなりました – Amitesh

+0

私はそれを試してみましょう。 –

関連する問題