2011-07-28 1 views
0

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

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) { }); 
} 

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

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

EDIT Вот фрагмент, чтобы дать вам представление о том, что файл 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"] 
    } 
]) 
+0

Вы объявляете var bookArray где-нибудь? Где он используется, что он не определен. Правильно ли я говорю, что это проблема с областью переменных, а не с вашим json? –

+0

bookArray объявлен в строке 4 моего фрагмента выше. Я еще не использовал его, чтобы проверить, что я пытался использовать оповещение, и он был неопределенным. В нижней части HTML-страницы я также попробовал document.write без везения. – Dusty

+0

Еще один глупый вопрос от меня. Вы вызывали parseResponse, прежде чем пытаться получить доступ к содержимому bookArray? –

ответ

0
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

Спасибо, это надо будет сделать. Это не будет красиво, но я полагаю, что это то, что я застрял, используя только HTML и JavaScript. – Dusty

0

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

+0

По-прежнему не повезло, я попробовал это. Я также пытался использовать bookArray [item] и bookArray ['item'] без везения. Я читал по другим вопросам, которые вам приходилось делать счетчику отдельно, поэтому у меня есть p. – Dusty

+0

В какой момент вы используете функцию parseResponse? Возможно ли, что вы пишете весь код в http://jsbin.com/? – czerasz

+0

parseResponse обернут вокруг json, так что JSONP работает. – Dusty

0

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

+0

от того, что я могу сказать, они взаимозаменяемы, как будто я предупреждаю (элемент), он отправляет 0,1,2,3 и т. Д. – Dusty

+0

Я бы подумал, что «я» будет индексом и «элементом», был бы объектом, но кажется, что вы используете их правильно, несмотря на то, как они называются. –

+0

OK - Я думал из документов jQuery (http://api.jquery.com/jQuery.each/), что первым параметром является индекс, второй - элемент. Я согласен, что вы правильно их используете, я просто подумал, что имена вводят в заблуждение. Вы пытались использовать любой из них в качестве индекса в bookArray вместо p? – tinyd

0

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

+0

Итак, как бы я это сделал? – Dusty

+0

Вы используете jQuery? –

+0

Наиболее распространенным решением является использование setInterval для опроса, если существует функция внутри скрипта, и когда это происходит, считается выполненной загрузкой. Вот почему ответ JSONP - это обратный вызов, обычно имеющий имя со случайным числом, чтобы избежать столкновений. Обратный вызов возвращает объект, содержащий ваш массив. –