2016-03-17 2 views
-2

Я пытаюсь реализовать ответ, приведенный в следующем вопросе: How do I return the response from an asynchronous call?Получение Аякса данных обратно вызывающей функции - необходимо уточнение предыдущего ответа

Прокрутка вниз к ответу по Hemant Bavle (в настоящее время 62 голосов). Это именно то, что я пытаюсь реализовать, но все равно не повезло. Вот моя попытка (я опустил ajaxSetup() и fail() для краткости):

function isGoodPIN(pin) { 
    var result; 
    var cURL = "server/checkPIN?pin=" + pin; 

    function setResult(ajaxResult) { 
     result = ajaxResult; // <--------- true here... 
    } 

    var ajaxResponse = $.get(cURL, function (data) { 
     // data is "OK" here... 
     setResult(data == "OK" ? true : false); 
    }); 

    return result; //<--------- undefined here 
} 

Является ли это проблемой, поскольку сфера результат setResult() является локальным для setResult() и не видно за его пределами? Если да, то каково решение этой проблемы?

+0

Почему вы все еще используете 'return', когда вы определили обратный вызов? Вся суть ответов на этот вопрос заключается в том, что вы не можете использовать оператор return при предоставлении данных из запроса AJAX. * Не используйте return *. Весь код, зависящий от результата запроса AJAX *, должен быть помещен в функцию обратного вызова, в вашем случае 'setResult()'. –

+0

Да, Рори. Меня преподают на этом уроке. Хотел не делать работу в обратном вызове. Спасибо –

+0

Я пытаюсь сделать функцию, которая вернет true/false, если данный PIN-код действителен или нет. Для этого требуется призыв ajax, но получение этого проклятого значения обратно из вызова ajax вызывающей функции действительно приводит меня в ногу. ;-) –

ответ

0

Вы по-прежнему не хватает точки AJAX; это есть это асинхронный. Это означает, что вы не можете вернуть что-либо из родительской функции, поскольку оператор return выполнит задолго до того, как данные будут возвращены из запроса.

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

function isGoodPIN(pin, validCallback, failCallback) { 
    $.get('server/checkPIN', { pin: pin }, function (data) { 
     if (data == "OK") { // note you should really use a boolean here 
      validCallback(); 
     } else { 
      failCallback(); 
     } 
    }) 
} 

isGoodPin('1234', function() { 
    console.log('valid pin'); 
}, function() { 
    console.log('invalid pin'); 
}); 
+0

Теперь это достойная идея. Различные обратные вызовы для разных результатов. ЧТО я могу сделать. Благодарю. Пометьте это как ответ, когда сможете. SO накладывает на него задержку, как я уверен, вы знаете. –

+0

Спасибо, @Rory, Ты посадил меня на правильный путь. Я довольно новичок в async, и это укусит меня в задницу, когда я не принимаю во внимание, что такое асинхронное средство, И каковы последствия. Невозможно сделать вызов ajax, а затем LATER принять решение на основе этого вызова. В конечном счете, любая работа, которая будет выполняться условно (или нет), должна выполняться при обратных вызовах success() или fail(). Как только я перестроил его для этого, все работает отлично. Спасибо, что указал мне в правильном направлении. –

+0

По совпадению, в вопросе, который я цитировал, решение Хеманта Бавла фактически НЕ является работоспособным решением? Кажется, он думает, что это сработает, и даже предположил, что он это сделал. –