Javascript 在另一个函数中调用外部函数会停止函数的执行

Javascript 在另一个函数中调用外部函数会停止函数的执行,javascript,Javascript,我在同一个.js文件中声明了这两个函数。第一个httpGet函数应该使用GET方法向RESTful API发出请求。这个函数是我以前使用过的,我知道它可以工作。第二个名为basicAccess的函数从HTML表单接收输入 执行basicAccess函数中的var-httpreq=httpGet(“127.0.0.1:5000”)函数调用之前的所有操作。一旦到达这一行,脚本就停止计算更多的代码行 我不想把basicAccess函数与httpGet函数中的内容混在一起。理想情况下,我也希望正则表达式

我在同一个
.js
文件中声明了这两个函数。第一个
httpGet
函数应该使用
GET
方法向RESTful API发出请求。这个函数是我以前使用过的,我知道它可以工作。第二个名为
basicAccess
的函数从HTML表单接收输入

执行
basicAccess
函数中的
var-httpreq=httpGet(“127.0.0.1:5000”)
函数调用之前的所有操作。一旦到达这一行,脚本就停止计算更多的代码行

我不想把
basicAccess
函数与
httpGet
函数中的内容混在一起。理想情况下,我也希望正则表达式匹配也在它自己的函数中,但当我尝试这样做时,它也会在我尝试引用外部函数时阻止脚本执行行

请让我知道,如果你有任何洞察我是如何处理这个错误。相当了解JavaScript,甚至不知道如何在论坛中充分搜索它

function httpGet(theUrl) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
    xmlHttp.send( null );
    return xmlHttp.responseText;
}

function basicAccess (form) {
    start =form.StartDate.value;
    end =form.EndDate.value;
    ethosBoundary = "2015-12-01"; 
    arg = 'false';
    re = /^\d{4}-\d{1,2}-\d{1,2}$/;

    if(form.StartDate.value != '' && !form.StartDate.value.match(re)) {
        alert("Invalid date format: " + form.StartDate.value);
        form.StartDate.focus();
        return false;
     }
    var httpreq = httpGet("127.0.0.1:5000");

    if (start > end){
        alert ("Error: " + "The start date: " + start + ", occurs after the end date: " + end);
        return;}
    if ((start < ethosBoundary) && (end < ethosBoundary))
        arg = 'both less';
    if ((start > ethosBoundary) && (end >  ethosBoundary)) 
        arg = 'both greater';
    if ((start < ethosBoundary) && (end > ethosBoundary)) 
        arg = 'start less end greater';

    alert ("you typed: " + arg)
}
函数httpGet(theUrl){
var xmlHttp=new XMLHttpRequest();
open(“GET”,theUrl,false);//对于同步请求为false
xmlHttp.send(空);
返回xmlHttp.responseText;
}
功能基本访问(表单){
开始=form.StartDate.value;
结束=form.EndDate.value;
ethosBoundary=“2015-12-01”;
arg='false';
re=/^\d{4}-\d{1,2}-\d{1,2}$/;
if(form.StartDate.value!=''&!form.StartDate.value.match(re)){
警报(“无效的日期格式:“+form.StartDate.value”);
form.StartDate.focus();
返回false;
}
var httpreq=httpGet(“127.0.0.1:5000”);
如果(开始>结束){
警报(“错误:+”开始日期:+start+”,发生在结束日期:+end之后);
返回;}
如果((开始ethosBoundary)和&(结束>ethosBoundary))
arg=‘两者都更大’;
如果((开始ethosBoundary))
arg='开始较少结束较大';
警报(“您键入:“+arg”)
}

这里有一条建议-如果函数的默认操作是异步的,除非您知道原因,否则篡改它是个坏主意

我假设您的代码在等待服务器响应时停止运行,这是阻止同步操作的典型副作用-您希望您的同步操作,这就是回调的原因

我已经实现了使用回调而不是变量赋值的代码-这允许它保持异步,正如
XMLHttpRequests
所预期的那样:

function httpGet(theUrl, callback) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            callback(xmlHttp.responseText);
        }
    }   
    xmlHttp.open( "GET", theUrl, true );
    xmlHttp.send();
}

function basicAccess (form) {
    var start = form.StartDate.value;
    var end = form.EndDate.value;
    var ethosBoundary = "2015-12-01"; 
    var arg = 'false';

    if (!check(form)) return false;

    httpGet("127.0.0.1:5000", function(httpreq){
        if (start > end){
            alert ("Error: " + "The start date: " + start + ", occurs after the end date: " + end);
            return;
        }
        if ((start < ethosBoundary) && (end < ethosBoundary))
            arg = 'both less';
        if ((start > ethosBoundary) && (end >  ethosBoundary)) 
            arg = 'both greater';
        if ((start < ethosBoundary) && (end > ethosBoundary)) 
            arg = 'start less end greater';

        alert ("you typed: " + arg)
    });
}

function check (form) {        
    var start = form.StartDate.value;
    var end = form.EndDate.value;
    var re = /^\d{4}-\d{1,2}-\d{1,2}$/;

    if(start != '' && !start.match(re)) {
        alert("Invalid date format: " + start);
        form.StartDate.focus();
        return false;
    }
    else {
        return true;
    }
}
函数httpGet(URL,回调){ var xmlHttp=new XMLHttpRequest(); xmlHttp.onreadystatechange=函数(){ if(xmlHttp.readyState==4&&xmlHttp.status==200){ 回调(xmlHttp.responseText); } } open(“GET”,theUrl,true); xmlHttp.send(); } 功能基本访问(表单){ var start=form.StartDate.value; var end=form.EndDate.value; var ethosBoundary=“2015-12-01”; var arg='false'; 如果(!check(form))返回false; httpGet(“127.0.0.1:5000”,函数(httpreq){ 如果(开始>结束){ 警报(“错误:+”开始日期:+start+”,发生在结束日期:+end之后); 回来 } 如果((开始ethosBoundary)和&(结束>ethosBoundary)) arg=‘两者都更大’; 如果((开始ethosBoundary)) arg='开始较少结束较大'; 警报(“您键入:“+arg”) }); } 功能检查(表格){ var start=form.StartDate.value; var end=form.EndDate.value; var re=/^\d{4}-\d{1,2}-\d{1,2}$/; if(start!=''&&!start.match(re)){ 警报(“无效的日期格式:“+开始”); form.StartDate.focus(); 返回false; } 否则{ 返回true; } }
如果您还有其他问题,我很乐意解释。

我会问一个显而易见的问题-您为什么要打同步电话?这一切都可以通过使用浏览器控制台上的callbacklook异步完成。是否有任何错误/通知?我可以想象,如果您向另一个URI发出同步请求,但CORS未启用,代码将终止。您如何处理
httpreq
,因为您似乎不使用它,或者发送任何东西,那么为什么要调用它:
httpGet(“127.0.0.1:5000”)?@Anonymous0day我拿出了我实际使用它的位置,并在提交到这里之前实际更改了GET请求中的URL。基本上,我将使用它从一些数据库中获取数据,并使用GoogleAPI创建一些图表。如果有道理的话。好的,谢谢!但是,似乎仍然没有解决问题提交表单时,httpGet函数末尾的警报没有出现,我不知道原因是什么?@StevenLayne如果没有实际的问题示例,恐怕我无法诊断问题-尝试插入
console.log()
调试程序中关键点的行,以查看其停止的位置(我还按照您的要求分离了regex函数),谢谢!我会继续检查。