我在同一个.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)
}
答案 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;
}
}
如果您有任何其他问题,我很乐意解释。