2017-01-25 6 views
1

У меня проблема с чем-то, что, вероятно, является простой ошибкой.Javascript AJAX Call Scope - возможно, глупо

Как вы заметите ниже, у меня есть проверка на дублируемую функцию, которая ссылается на внешний PHP, проверяющий базу данных. PHP работает и возвращает данные.

Когда я использую duplicationCheck.done() и анализирую данные, оператор if отвечает правильно (т. Е. Если пользователь ввел дубликат, это проверяет это. ЗДЕСЬ Проблема: несмотря на то, что инструкция if ниже работает правильно, когда isDuplicate имеет значение true, он отображается как неопределенный, когда команда console.log вызывается под функцией done(). Я не могу понять, почему. В моих исследованиях я считаю, что это проблема с асинхронным характером AJAX позвонить?

Спасибо за ваше время. Любые идеи?

$("#username_submit").click(function() { 

    function checkForDuplication(username) { 
    return $.ajax({ 
     url: 'static/experiments/computerized_handwriting/random_assignment.php', 
     type: 'POST', 
     data: {userName: username} 
    }); 
    } 

var duplicationCheck = checkForDuplication($('input:text').val()); 


    var isDuplicate; 
    duplicationCheck.done(function(data){ 
     var response = JSON.parse(data); 
     if(response.data['json_array'] == "duplicate"){ 
      isDuplicate = true; 
      alert("dup"); 
     } else { 
     isDuplicate = false; 
     } 
    }); 

    console.log(isDuplicate); 

.... 
+0

Вы можете запускать события по конкретным элементам, используя [ '.Кнопкой()'] (https://api.jquery.com/change/) вместо того, чтобы делать все это за 1 ход. – Xorifelse

+0

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) – Jacob

+0

@Jacob Я читал это несколько раз, но не могу понять, какая часть имеет отношение к моей конкретной проблеме. Вы можете помочь? –

ответ

1

Это связано с асинхронной природы Ajax.

Вам необходимо проверить дублирование после его возврата с сервера в выполненную функцию. Но ваша переменная duplicationCheck не является ссылкой на функцию, а то, что она возвращает.

Правильный путь будет выглядеть так:

$("#username_submit").click(function() { 
    $.ajax({ 
    url: 'static/experiments/computerized_handwriting/random_assignment.php', 
    type: 'POST', 
    data: { userName: $('input:text').val()} 
    }).done(function() { 
    var response = JSON.parse(data); 
    if (response.data['json_array'] == "duplicate") { 
     isDuplicate = true; 
     alert("dup"); 
    } 
    else { 
    isDuplicate = false; 
    } 
    console.log(isDuplicate); 
    });//done 
});//submit click 

.... 
+0

Спасибо! Чтобы добиться необходимой функциональности, мне пришлось изменить это на синхронный вызов (я знаю, глупый, но обычно я использую традиционные вызовы). Ваш код действительно помог, оцените его! –