Loading...
agogo avatar agogo 12 Точки

Javascript - Undefined ?

Здравейте!

Искам да ви попитам, като за лаик, защо следният код дава undefined?

var loadjson = function(file){
 var xmlhttp = new XMLHttpRequest();
 xmlhttp.open("GET", file);
 xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        return JSON.parse(xmlhttp.responseText);
    }
 }
 xmlhttp.send();
};

 function setTypePrice() {
   var json = loadjson('data/ws.json');

  ....

}

setTypePrice();                                                                         // json is undefined

 

Благодаря, предварително!

Тагове:
0
JavaScript Fundamentals 18/11/2015 11:40:52
RoYaL avatar RoYaL Trainer 6849 Точки
Best Answer

Защото имаш асинхронно събитие, което още не се е извършило, в момента, в който си извикал функцията. Тъй като идеята на асинхронните неща е те да се изпълняват, докато останалата част от кода също се изпълнява, в случая няма изчякване.

Това, което се опитваш да направиш е близо до невъзможно. Направи функцията да приема callback, който да се изпълни, когато асинхронната заявка мине.

Другия вариант е да ползваш промиси. Намери библиотека, която ги абстрактва. Мисля, че дори jQuery има Deffered.

http://stackoverflow.com/questions/5150571/javascript-function-that-returns-ajax-call-data

1
agogo avatar agogo 12 Точки

Благодаря!

Изглеждаше прекалено лесно, но уви!

Следващия код, мисля че сработи. Поне получавам json файла, като променлива. Благодаря за насоката :)

var loadjson = function(file,callback){
 var xmlhttp = new XMLHttpRequest();
 xmlhttp.open("GET", file);
 xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        callback.call(JSON.parse(xmlhttp.responseText));
    }
 }
 xmlhttp.send();
};

loadjson('data/ws.json', function(){
 var json = this;
 console.log(json);
});                                                                                                 // Object { type: Array[6], size: Array[6], kb: Array[1], other: Array[2] }

0
18/11/2015 14:31:56
RoYaL avatar RoYaL Trainer 6849 Точки

Да, така ще се стигне до тази променлива когато се изпълни заявката :-)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.