12

我正在尝试使用 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/

4

2 回答 2

23

为了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 没有内置的 Deferred 支持。今天做这样的事情要简洁和灵活得多:

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

// Usage:
getAllSupportedItems().done(function (items) {
    // you have your items here
});
于 2010-05-08T01:48:49.937 回答
0

你怎么用这个?如果您希望主函数(“getAllSupportedItems”)返回您创建的数组,那将无法正常工作。该$.getJSON函数是异步的,因此在外部函数返回之前,处理程序不会真正构建数组。

于 2010-05-08T00:54:13.990 回答