6

一般的な REST 標準に従って、リソースを個別のエンドポイントと呼び出しに分割しました。ここで問題となっている主な 2 つのオブジェクトはListandItemです (もちろん、リストにはアイテムのリストと、それに関連付けられた他のデータがあります)。

そのため、ユーザーが自分のリストを取得したい場合は、Get リクエストを行うことができますapi/Lists

次に、ユーザーはそれらのリストの 1 つでアイテムを取得し、前の呼び出しで取得されたapi/ListItems/44 が見つかった場所にGet を作成することができます。List.listId

options.complete属性で$.ajaxコールバック メソッドを指定できるので、これら 2 つのイベントを簡素化できます。

しかし、問題のすべてのリストの要素を取得したい場合、事態は非常に厄介になります。たとえば、makeGetRequestこのコードを簡潔にするために、エンドポイントとコールバック関数を受け取るライブラリ関数が呼び出されたとします。素朴な方法で単純に 3 つの要素を取得すると、次のようになります。

var success1 = function(elements){
    var success2 = function(elements){
       makeGetRequest("api/ListItems/3", finalSuccess);
    }
    makeGetRequest("api/ListItems/2", success2);
}
makeGetRequest("api/ListItems/1", success1);

おぞましい!これは、プログラミング 101 で、手首を叩いてループを指さすようなものです。しかし、外部ストレージに頼らずにループでこれを行うにはどうすればよいでしょうか?

for(var i : values){
    makeGetRequest("api/ListItems/" + i, successFunction);
}

function successFunction(items){
    //I am called i-many times, each time only having ONE list's worth of items!
}

また、ストレージを使用する場合でも、すべてのデータがいつ終了して取得されたかを把握し、収集されたすべてのデータを取得して何かを行うマスター関数を呼び出す必要があります。

これを処理するための練習はありますか?これは以前に何度も解決されたに違いありません...

4

2 に答える 2

4

エンドポイント パラメータのスタックを使用してみてください。

var params = [];
var results [];

params.push({endpoint: "api/ListItems/1"});
params.push({endpoint: "api/ListItems/2"});
params.push({endpoint: "api/ListItems/3"});
params.push({endpoint: "api/ListItems/4"});

次に、成功ハンドラーで再帰的にすることができます。

function getResources(endPoint) {

   var options = {} // Ajax Options
   options.success = function (data) {
       if (params.length > 0) {
           results.push({endpoint: endpoint, data: data});
           getResources(params.shift().endpoint);
       }
       else {
          theMasterFunction(results)
       }
   }

   $.get(endPoint, options)
}

そして、次のような単一の呼び出しで開始できます。

getResources(params.shift().endpoint);

編集:

すべてを自己完結させ、グローバル スコープから除外するには、関数を使用してコールバックを提供します。

function downloadResources(callback) {

    var endpoints = [];
    var results [];

    endpoints.push({endpoint: "api/ListItems/1"});
    endpoints.push({endpoint: "api/ListItems/2"});
    endpoints.push({endpoint: "api/ListItems/3"});
    endpoints.push({endpoint: "api/ListItems/4"});

    function getResources(endPoint) {
        var options = {} // Ajax Options
        options.success = function (data) {
           if (endpoints.length > 0) {
               results.push({endpoint: endpoint, data: data});
               getResources(endpoints.shift().endpoint);
           }
           else {
              callback(results)
           }
        }
       $.get(endPoint, options)
    }

    getResources(endpoints.shift().endpoint);

}

使用中で:

downloadResources(function(data) {
   // Do stuff with your data set
});
于 2012-08-02T17:48:34.167 に答える
2

dmck の答えはおそらくあなたの最善の策です。ただし、API が api/ListItems/?id=1&id=2&id=3.

それがあなたの個人的な美学にもっと適合する場合は、API 検索エンドポイントを実行することもできます。

于 2012-08-02T17:53:03.947 に答える