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 に答える