#javascript
#javascript
Вопрос:
в этом коде этот метод возвращает значение undefined, несмотря на то, что оператор alert выводит значение?
function getNearestPoint(idd)
{
var xmlhttp;
var resu<
if(window.XMLHttpRequest)
xmlhttp=new XMLHttpRequest();
else
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 amp;amp; xmlhttp.status==200)
{
result= xmlhttp.responseText;
alert(result);
}
}
xmlhttp.open("GET","ajax_get_nearest_location.php?id=" idd "amp;radius=1",true);
xmlhttp.send();
return resu<
}
Комментарии:
1. Потому что ваша функция возвращается до того, как результат возвращается из запроса AJAX. Запрос является асинхронным.
2. Я боюсь, что люди никогда не перестанут задавать такого рода вопросы …. :-/ Мы должны начать какую-то кампанию.
3. @Felix нам нужен справочный вопрос, на который мы все можем сослаться (или закрыть как дубликат) 🙂
Ответ №1:
результат на этом этапе не определен, он определяется только после выполнения вашего обратного вызова. Порядок выполнения:
getNearestPoint
запускается- XHR отключен
getNearestPoint
ВОЗВРАТundefiend
- XHR возвращается и запускается
xmlhttp.onreadystatechange
- результат устанавливается
Если вам нужен результат ИЗВНЕ этого, вы должны использовать обратный вызов:
getNearestPoint(idd, cb){
...
xmlhttp.onreadystatechange = function(){
...
cb(result);
}
}
и ваш вызывающий код изменяется с:
var result = getNearestPoint(id);
Для:
getNearestPoint(id, function(result){
// do something with resu<
});
Комментарии:
1. я хочу назвать это таким образом? var url=»getShortestPath.php?from=» getNearestPoint(id1) «amp;to=» getNearestPoint (id2); как я могу это сделать?
2. @adham: Это невозможно при асинхронных вызовах.
Ответ №2:
Это происходит из-за асинхронной природы Ajax («Асинхронный JavaScript и XML»): запрос все еще будет выполняться при запуске вашего кода return result
. Обратный вызов readystatechange еще не был вызван, а result
переменная еще не установлена.
Обычный способ справиться с этим — изменить архитектуру скрипта: делайте все, что вам нужно, на основе result
непосредственно в onreadystatechange
обратном вызове. (или, конечно, передать функцию обратного вызова с желаемыми действиями и выполнить ее в обработчике.)
Комментарии:
1. Единственным недостатком прямого запуска кода в
onreadystatechange
является то, что это снижает возможность повторного использования кода. В общем, лучше использовать обратный вызов
Ответ №3:
result
оператор setting выполняется внутри асинхронной функции Ajax
Потому что ваш второй if
оператор (который устанавливает result
значение) не попадает. Почему нет? Потому что в тот момент, когда вы отправляете Ajax-запрос, вы возвращаете result
значение, которое все еще не определено. Вызов Ajax позже выполнит анонимную функцию и установит эту result
переменную, которая была возвращена давным-давно.