2015-02-01 2 views
2

Я явно пишу слишком много CoffeeScript, так как теперь я понимаю, что у меня нет даже базового понимания сферы в чистом JS.Сфера применения JavaScript/jQuery

После игры на некоторое время, я не могу понять проблему с following--

$(document).ready(function() { 
    var myUrl = "http://notimportant.com/" 
    var photos = getPhotos(myUrl); 
    console.log(photos);      //undefined 
}); 

function getPhotos(url) { 
    var a; 
    $.get(url, function(data) { 
     a = data["photoset"]["photo"]; 
     console.log(a);      //my object 
    }); 
    return a; 
} 

Если я ставлю console.log (а) заявление на линии прямо под «вар а = данные [ "фотосет"] [ "фото"];» он показывает, что он правильно делает запрос GET, который я ищу. Но я не могу передать этот объект обратно в свой основной блок кода, где я хочу манипулировать им.

Заранее спасибо.

+1

'$ .get' является асинхронным. Операция 'return a; 'возвращается немедленно (поэтому вы видите' undefined' в своей консоли) после того, как сделан ваш 'get'. Второй аргумент в get, 'function (data)' - это ваш обратный вызов, который выполняется, когда возвращается ответ ajax (с соответствующими данными, которые вы видите на своей консоли). Чтобы манипулировать данными, вы можете вызывать функцию из вашего обратного вызова 'get'. – Jack

ответ

0

Причина photos не определена из-за областей. Его потому, что $.get выполняется асинхронно. $.get() возвращает объект jqXHR вместо ответа HTTP.

onSuccess Обратный звонок должен быть отправлен в getPhotos(), чтобы обеспечить его работу. В качестве альтернативы можно использовать конструкцию when().then().

$(document).ready(function() { 
    var myUrl = "http://example.com/"; 
    getPhotos(myUrl, renderCatPhotos);  
}); 

function getPhotos(url, onSuccess) { 
    $.get(url, onSuccess); 
} 

function renderCatPhotos(data) { 
    var a = data.photoset.photo; 
    console.log(a); // a is always available 
} 

примечание: вы можете даже не нужно getPhotos функцию. Вы можете просто $.get(url, onSuccess); в $(document).ready() вместо этого.

+0

Спасибо, что нашли время, чтобы написать это, Джев. Я заметил, что console.log печатались в неожиданном порядке. По крайней мере, рад узнать, что я не схожу с ума. Цените, что вы нашли время, чтобы написать это! –

0

Это не вопрос объема, это вопрос того, что вы возвращаете неопределенную переменную до того, как $ .get определяет ее. Подумайте о том, чтобы сделать фотографии глобальными, а затем установить их в функции успеха $ .get вместо того, чтобы устанавливать ее в 'a'. Внутри функции успеха вы можете затем вызывать вызовы для других функций, которые будут управлять отображением/обработкой фотографий.

+0

Спасибо, Vizkos. Это точно. Рад узнать, что я не схожу с ума. Цените, что вы указываете мне в правильном направлении. –

Смежные вопросы