Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,在满足条件之前,如何停止任何进一步的迭代_Javascript_Jquery_Ecmascript 5 - Fatal编程技术网

在Javascript中,在满足条件之前,如何停止任何进一步的迭代

在Javascript中,在满足条件之前,如何停止任何进一步的迭代,javascript,jquery,ecmascript-5,Javascript,Jquery,Ecmascript 5,在过去的两周里,我一直在努力解决以下问题,但毫无进展,希望有人能给我指出正确的方向 我有一个单页应用程序,它使用JS和jQuery以及xml逻辑条件和操作 JS允许函数异步运行是很好的,但我需要解决一个问题 当用户单击某个元素时,js遍历xml并查找与元素ID相关的节点,检查是否满足条件集并触发相关操作。XML iis的一段代码,如下所示 <block id="10000005" triggerID="125"> <ConditionsAndActions name="D

在过去的两周里,我一直在努力解决以下问题,但毫无进展,希望有人能给我指出正确的方向

我有一个单页应用程序,它使用JS和jQuery以及xml逻辑条件和操作

JS允许函数异步运行是很好的,但我需要解决一个问题

当用户单击某个元素时,js遍历xml并查找与元素ID相关的节点,检查是否满足条件集并触发相关操作。XML iis的一段代码,如下所示

 <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>
html


沙箱
沙箱试验
请求手动记录
请确认您希望创建手动记录

接受衰退


循环不会暂停以完成异步操作(如setTimeout)这正是JavaScript(单线程语言)执行语句的方式。因此,循环中的
setTimeout
不起作用

虽然还不清楚为什么要将
triggerations
的逻辑放在
for
循环中,如果它只是一个单击按钮的动作,可能只会触发xml中的一个对应动作

无论您的场景或业务需求是什么,您都可以调整
触发操作,如下所示,以使其在当前场景中正常工作

其思想是存储索引,当您等待用户处理特定条件时,
for
循环将使用这些索引恢复,然后再次调用
triggerations
从原来的位置恢复循环

var startIndexOuterLoop,startIndexInnerLoop//保留'AskForConfirmation'场景的for循环索引的引用
函数触发动作(参数…,恢复模式){
变量iA1,iA2;
如果(恢复模式){
iA1=startIndexOuterLoop;
iA2=startIndexInnerLoop;
}否则{
iA1=0;
iA2=
}
var outerLoopIterateOnce=false;
对于(;i<…;i++){
//将iA2重置为0(向前),对吗
if(outerLoopIterationce){
iA2=0;
}
OuterLoopIterationce=true;
对于(;i<…;i++){
//…声明
if(/*AskForConfirmation的条件*/){
手动力确认(iA1、iA2);
return;//退出函数
}
}
}
}
功能手柄力确认(iA1、iA2){
startIndexOuterLoop=iA1+1;//1已添加,以便继续下一次迭代
startIndexInnerLoop=iA2+1;
//添加等待超时等逻辑
//一旦过期或按照业务逻辑再次调用triggerations,并将多个参数设置为true,以间接恢复foor循环
触发动作(参数…,真);

}
我通过跟踪行动编号和添加计数器机制来消除问题,以跟踪行动完成时更新的状态,然后启动下一个行动

我理解上面的代码缺少AskForConfirmation开关案例;它简单地将一个变量设置为“等待”,弹出一个带有问题和“是/否”按钮的灯箱,然后使用setTimeout循环,直到用户单击其中一个按钮或30秒时间更新变量。如果创建一个示例,您可能会得到更多响应。创造的行为本身可能有帮助。同意上述观点。这是太多的代码,无法通过。不过,我的初步评估是,您可以设置一个标志来确定您的功能是否应该继续。如果该标志为真,请不要运行该函数,如果愿意,请在30秒后再次尝试运行该函数。如果此时该标志仍然为真,请停止执行。旁白:您不应该使用
childNodes
来使用xml/html,因为它非常脆弱,可能会打破细微的差异,例如不同浏览器上的不同空白解释。使用标记名和长选择器、CSS或XPATH进行更短、更具相关性和更持久的数据消耗。Amitesh,如果我正确理解这实际上是在存储数组或值对象并退出循环。一旦准备好继续,返回循环中我以前使用数组或对象值的点?是的。。但只要记住循环的索引就足以继续。。无需存储函数的整个状态(对象数组等)。我会尝试一下。我通过跟踪操作编号并添加计数器机制来跟踪状态,跟踪状态在操作完成时更新,然后触发下一个操作,从而消除了此问题。您可以提供一个片段来说明如何实现此目标。
 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;
                    }
                }
            }
        }
    }
}
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);
    });
});
<!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>