我正在尝试使用Jquery从本地文件中获取JSON对象(产品)的列表,并将所有对象存储在称为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调用需要同步运行。
getAllSupportedItems
getJSON 转换为以下异步调用:
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没有内置的Deferred支持。今天做这样的事情更加简洁和灵活:
function getAllSupportedItems( ) { return $.getJSON("allItems.json").then(function (data) { return data.items; }); } // Usage: getAllSupportedItems().done(function (items) { // you have your items here });