Как вернуть массив, созданный в дочерней функции jQuery, из родительской функции в Javascript? - PullRequest
0 голосов
/ 22 сентября 2011

Я использую функцию jQuery json внутри другой функции, как я могу вернуть массив, созданный в функции jQuery, в качестве возвращаемого значения моей родительской функции?

это базовая настройка

function getFlickrSet(flickr_photoset_id){
  var images = [];

  images = $.getJSON(url, function(data){ return data; // I HAVE THE DATA HERE };

  return images // I HAVE NO DATA HERE
}
var myImages = getFlickrSet(23409823423423);
alert(myImages); // this gives me nothing

Я настроил пример для jsfiddle прямо здесь , если бы вы могли сказать мне, где мой код неправильный, я был бы очень признателен.Спасибо!

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Вы не можете. Вместо этого передайте функцию:

function getFlickrSet(flickr_photoset_id, when_ready){
  var images = [];

  $.getJSON(url, function(data){ 
    // prepare images
    when_ready( images );

  });
}

getFlickrSet(nnnn, function(images) {
  alert(images);
});

Почему ты не можешь этого сделать? Потому что вызов $ .getJSON () - асинхронный . К тому времени, когда вызывается функция обратного вызова (там, где вы написали: «У меня есть данные здесь»), внешняя функция уже вернулась. Вы не можете заставить браузер ждать завершения этого вызова, поэтому вместо этого вы разрабатываете API так, чтобы код мог передаваться и запускаться позже, когда будет доступен результат.

1 голос
/ 22 сентября 2011

Хорошо, Ajax является асинхронным (это то, что означает «A»), поэтому вы должны сделать это асинхронным способом, который сводится к обратным вызовам.Что вам нужно сделать, это передать функцию обратного вызова в вашу внешнюю функцию, которую вы хотите вызвать ("callback", если хотите), когда запрос Ajax завершится.Вы можете просто дать ему «предупреждение» следующим образом:

function getFlickrSet(flickr_photoset_id) {
  images = $.getJSON(url, alert); // <-- just the name of the function, no ()
}
var myImages = getFlickrSet(23409823423423);
// => An alert pops up with the data!

... но, скорее всего, вы напишите что-то вроде этого:

function doSomethingWithData(data) { // we'll use this later
  alert(data); // or whatever you want
}

function getFlickrSet(flickr_photoset_id, callback) {
  // new parameter here for a function ------^
  // to be given here -------v
  images = $.getJSON(url, callback);

  return images // I HAVE NO DATA HERE
}

var myImages = getFlickrSet(23409823423423, doSomethingWithData);
// => Your function `doSomethingWithData` will be called the data as a parameter
//    when the $.getJSON request returns.
...