JSONP массив не определен вне функции - PullRequest
0 голосов
/ 28 июля 2011

Я нашел много вопросов, похожих на мои;но ни один из ответов, которые я видел, казалось, не работал для меня.Так вот моя проблема.Я использую JQuery JSONP, чтобы получить довольно много информации о некоторых книгах (JSON статичен, поэтому в него встроена жестко закодированная функция).У меня это отлично работает.Моя проблема заключается в том, что мне нужно ссылаться на JSON еще несколько раз, и, учитывая его статичность, я решил установить локальный массив со значениями.Итак, вот мой код ниже:

function changeList(cat) {
  getList(cat);
}
var bookArray = new Array();

function parseResponse(jsonData) {
  $('#bookList').empty();
  var items = [];
  var p = '0';
  $.each(jsonData, function(item, i) {
    bookArray[p] = { 'bookId':i.bookId, 'category':i.category, 'publishedDate':i.publishedDate, 'title':i.title, 'description':i.description, 'images':i.images };

    var allImages = i.images;
    if(allImages.length > 1) {
      var imageLoc = allImages.toString().split(",");
    } else {
      var imageLoc = new Array(allImages);
    }
    var theDate = new Date();
    theDate.setTime(i.publishedDate * 1000);
    var year  = theDate.getUTCFullYear(); 
    var month = theDate.getUTCMonth();
    var day = theDate.getUTCDate();
    var d = months[month] + " " + day + ", " + year;

    items.push('<li><a href="/' + i.category + '/' + i.bookId + '/index.html"><img border="0" height="70" width="124" src="' + imageLoc[0] + '"><p>Published: <strong>' + d + '</strong><br /><span class="bookTitle">' + i.title + '</span> ' + i.description + '</p></a></li>');
    p++;
  });

  $('<ul/>', {
    html: items.join('')
  }).appendTo('#bookList');
}

function getList(section) {
  $.getJSON('http://www.otherdomain.com/book_'+ section +'.json?format=jsonp&callback=?', function(data) { });
}

То, что делает фрагмент кода выше, выплевывает список книг из определенной категории на странице.Слева есть меню, в котором есть категории и запускается функция changeList () (которая, в свою очередь, запускает другие функции, чтобы нарисовать правильный json и выплюнуть их на странице).Эта часть работает безупречно!

Это подводит меня к моей проблеме, как вы можете видеть в функции parseResponse (), которую я заполняю созданным мной массивом bookArray.Если я ссылаюсь на этот массив внутри функции, у меня нет проблем.Тем не менее, если я пытаюсь ссылаться на него снаружи (например, alert (bookArray [0] ['title']), я получаю, что он не определен. Что я делаю не так? Я не самый технически подкованный человек, поэтому у вас естьиспользовать маленькие слова на меня. Спасибо за любую помощь!

РЕДАКТИРОВАТЬ Вот фрагмент, чтобы дать вам представление о том, как выглядит файл JSON:

parseResponse(
[{
        "bookId":"1",
        "category":"A",
        "publishedDate":"1266870137",
        "title":"Title to first story",
        "description":"The first story.",
        "images":["http://www.otherdomian.com/books/fff.jpg","http://www.otherdomian.com/books/aaa.jpg"]
    },{
        "bookId":"2",
        "category":"A",
        "publishedDate":"1366870142",
        "title":"Title to second story",
        "description":"The second story.",
        "images":["http://www.otherdomian.com/books/fff.jpg","http://www.otherdomian.com/books/aaa.jpg"]
    }
])

Ответы [ 4 ]

0 голосов
/ 28 июля 2011
function getList(section) {
    $.getJSON('http://www.otherdomain.com/book_'+ section +'.json?format=jsonp&callback=?', parseResponse);
}

AJAX-вызовы являются асинхронными, поэтому вы не можете начать работу с данными до завершения запроса. Это устанавливает parseResponse в качестве обратного вызова, что означает, что он вызывается после завершения запроса. На этом этапе вы получите свой JSON.

Если вы хотите получить доступ к данным извне, вы должны убедиться, что вы делаете это после завершения обратного вызова, что означает, что любой другой код, который нуждается в его дальнейшем использовании, должен вызываться из вашего обратного вызова. .

var bookArray = []; //use this instead of new Array(). There are security issues with the former (Array can be overridden)

function parseResponse(jsonData) {

   /*
     ... existing code ...
   */

   otherFunctionThatNeedsBookArray(); //alternatively you can set bookArray as a local variable and call otherFunctionThatNeedsBookArray(bookArray);
}
0 голосов
/ 28 июля 2011

Этот первый бит не является ответом на ваш вопрос, но у вас неверные параметры jQuery.each (), я думаю, в этом 'i' должно быть вашим индексом, а 'item' должно быть значением.Я могу ошибаться, но тогда вы сможете использовать i вместо p для индексации массива

0 голосов
/ 28 июля 2011

Я собираюсь сделать удар в темноте. Ваш заголовок предполагает, что вы используете ajax-запрос JSONP, который ВСЕГДА асинхронный. Я предполагаю, что вы пытаетесь получить доступ к содержимому вашей глобальной переменной до ответа на запрос JSONP. В jQuery было бы целесообразно получить доступ к данным из обратного вызова «success».

0 голосов
/ 28 июля 2011

Может быть потому, что p определяется как строка p='0'. Попробуйте p=0;

...