2015-11-03 8 views
0

У меня есть две функции, объявленные в том же файле .js. Предполагается, что первая функция httpGet делает запросы к API RESTful с использованием метода GET. Эта функция является той, которую я использовал раньше, и я знаю, что она работает. Вторая функция под названием 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) 
} 
+5

Я задам очевидный вопрос - почему вы делаете синхронный звонок? Это можно сделать асинхронно, используя обратные вызовы –

+2

Посмотрите на консоль браузера. Есть ли ошибки/уведомления? Я мог представить, что код завершается, если вы делаете синхронный запрос на другой URI, но CORS не включен. –

+0

Что вы делаете с 'httpreq', потому что вы, кажется, не используете его или не отправляете что-либо, поэтому почему этот вызов:' httpGet ("127.0.0.1:5000"); '? – Anonymous0day

ответ

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; 
    } 
} 

Я был бы счастлив, чтобы объяснить, если у вас есть какие-либо другие вопросы.

+0

Хорошо, спасибо! Однако, по-прежнему, похоже, не было исправлено проблема, предупреждение в конце функции httpGet не появляется, когда я отправляю форму, и я не уверен, почему? –

+0

@StevenLayne Я боюсь, что не смогу диагностировать проблему без реального примера проблемы - попробуйте вставить 'console.log()' отладочные строки в ключевых точках программы, чтобы увидеть, где она останавливается (i 've также разделил функцию регулярного выражения, как вы хотели) –

+0

Спасибо! Я буду продолжать проверять. –