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