如何根据AJAX调用的响应打破javascript循环?

如何根据AJAX调用的响应打破javascript循环?,javascript,ajax,Javascript,Ajax,我的话题在这里已经被广泛地讨论过了。我已经搜索了很多,尝试了很多代码,但没有找到任何可以帮助我解决具体情况的东西。所以我想向社会提出这个问题 我正在构建一个包含12个表单字段的页面,在其中我循环遍历这些字段并进行AJAX调用,以根据数据库测试值。我的问题是,我需要停止循环,并根据AJAX调用的特定响应获取用户输入。到目前为止,我一直无法停止我的循环,直到它到达终点 这是我的表格: <form name="claimForm"> <table> <tr> <

我的话题在这里已经被广泛地讨论过了。我已经搜索了很多,尝试了很多代码,但没有找到任何可以帮助我解决具体情况的东西。所以我想向社会提出这个问题

我正在构建一个包含12个表单字段的页面,在其中我循环遍历这些字段并进行AJAX调用,以根据数据库测试值。我的问题是,我需要停止循环,并根据AJAX调用的特定响应获取用户输入。到目前为止,我一直无法停止我的循环,直到它到达终点

这是我的表格:

<form name="claimForm">
<table>
<tr>
<td> <input type="text" id="icdcode1"></td>
<td> <input type="text" id="icdcode2"></td>
<td> <input type="text" id="icdcode3"></td>
<td> <input type="text" id="icdcode4"></td>

</tr>

<tr>
<td> <input type="text" id="icdcode5"></td>
<td> <input type="text" id="icdcode6"></td>
<td> <input type="text" id="icdcode7"></td>
<td> <input type="text" id="icdcode8"></td>

</tr>

<tr>
<td><input type="text" id="icdcode9"> </td>
<td> <input type="text" id="icdcode10"></td>
<td> <input type="text" id="icdcode11"></td>
<td> <input type="text" id="icdcode12"></td>

</tr>

<tr> <td colspan="4"> <input type="button" value="Check IDC Code" onClick="javascript:claimValidate();"></td></tr>
</table>


</form>

<div id="pageresponse"></span>
我的意图是打破循环,在ajaxCheck中到达最后一个if语句时停止,但事实并非如此,我不知道为什么。我向一位同事展示了我的代码,他似乎认为ajaxCheck实际上不会返回任何东西,因为它是在一个单独的函数中调用的。他建议将我所有的表单字段作为一个数组传递到我正在进行数据库检查的ASP页面,但我不确定这是最好的解决方案

如果专家们能为我提供任何指导,我将不胜感激

谢谢大家!


--Chris

您可以使用一个全局变量来表示您希望循环继续或停止。 然后在claimValidate中,你会把

if (!loopActive) return;
但这是一种糟糕的做法。最好是像@MarcB和@JamesThorpe所建议的那样进行重组


我只是用这个想法来回答,因为我知道,为了学习任何东西,你必须先以非最佳方式取得进展,然后逐步了解为什么这不是最佳做法。

你提到这里已经广泛介绍了这一点,你看到了吗?本质上,您的
ajaxCheck
函数不能以这种方式返回要在循环中使用的值。您需要进行一些重构。您不能,除非您切换到使用同步调用,或者拆分您的逻辑,以便在ajax调用的成功处理程序中执行“got a response”逻辑。感谢您的响应。我没有看到@James Thorpe链接到的文章。这看起来是处理我想要完成的事情的好方法。我会试试看。这只有在请求是同步的情况下才有效(你真的希望避免这种情况——它们被弃用了,可能会在某个时候被删除)。对于异步请求,您会发现整个循环在第一个ajax请求返回之前运行。
function ajaxCheck(icdcode) {

var xmlhttp = new XMLHttpRequest();    

 xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
            //alert(isFound)
            resp = xmlhttp.responseText;

            if (resp == icdcode) {
                return true;
            } else if (resp == "Search Failed") {
                alert("You must enter a valid issue code.")
                return false;
            }  // end if resp

        if ((resp !== "Search Failed") && (resp.length > 0)) { 
                document.getElementById("pageresponse").innerHTML = resp;
                return false;
            }

        } // end readystate

    } // end onreadystatechange

                xmlhttp.open("GET", "validate_idc_code.asp?q=" + icdcode, true);
                xmlhttp.send();

} // end ajaxCheck
if (!loopActive) return;