Используя jQuery, чтобы получить объекты JSON из локального файла

StackOverflow https://stackoverflow.com/questions/2792423

Вопрос

Я пытаюсь получить список объектов JSON (продукты) из локального файла, используя jQuery и хранить все объекты в одном массиве, называемых allitems. Файл находится в одном каталоге, что и код, и он называется «allitems.json». Вот как я делаю это сейчас:

function getAllSupportedItems(){
    var allItems = new Array();
    $.getJSON("allItems.json",
         function(data){
             $.each(data.items, 
             function(item){
                 allItems.push(item);
             });
         });
    return allItems;
}

На основании этого примера: http://api.jquery.com/jquery.getjson/

Это было полезно?

Решение

Для getAllSupportedItems Чтобы иметь возможность вернуть любые элементы, вызов AJAX должен работать синхронно.

getJSON Переводится в следующий асинхронный звонок:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Асинхронный по умолчанию. Поэтому вы должны явно изменить ваш запрос на синхронный:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback,
  async: false
});

Альтернатива - переосмыслить то, как вы используете getAllSupportedItems и сделать его в асинхронную утилиту:

function getAllSupportedItems(callback){
    $.getJSON("allItems.json",
         function(data){
             var allItems = [];
             $.each(data.items, 
             function(item){
                 allItems.push(item);
             });
             callback(allItems);
             // callback(data.items); should also work
         });
}

Обновлять

Когда я изначально писал этот ответ, jQuery не имел встроенной отложной поддержки. Это гораздо большим, кратко и гибко, чтобы сделать что-то вроде этого сегодня:

function getAllSupportedItems( ) {
    return $.getJSON("allItems.json").then(function (data) {
        return data.items;
    });
}

// Usage:
getAllSupportedItems().done(function (items) {
    // you have your items here
});

Другие советы

Как вы используете это? Если вы ожидаете основной функции («GetAllsupporporteTems»), чтобы вернуть Массив, который вы делаете, хорошо, что не будет работать. То $.getJSON Функция есть асинхронный, И поэтому обработчик на самом деле не будет создавать массив до возвращения внешней функции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top