почему этот метод JavaScript возвращает значение undefined?

#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 переменную, которая была возвращена давным-давно.

Ajax является асинхронным, и ваш код не учитывает это.