Используя jQuery, чтобы получить объекты JSON из локального файла
-
04-10-2019 - |
Вопрос
Я пытаюсь получить список объектов 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
Функция есть асинхронный, И поэтому обработчик на самом деле не будет создавать массив до возвращения внешней функции.