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

时间:2015-11-03 16:17:21

标签: javascript

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

执行var httpreq = httpGet("127.0.0.1:5000")函数中的basicAccess函数调用之前的所有内容。一旦它到达这一行,脚本就会停止评估更多的代码行。

我不想让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)
}

1 个答案:

答案 0 :(得分:0)

这是一条建议 - 当一个函数的默认操作是异步时,除非你知道原因,否则篡改它是个坏主意。

我假设代码的操作在等待服务器响应时暂停,这是阻止同步操作的典型副作用 - 您希望自己成为non-blocking,这是回调的来源。

我已经实现了您的代码以使用回调而不是变量赋值 - 这允许它保持异步,因为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;
    }
}

如果您有任何其他问题,我很乐意解释。