2

$ cacheFactoryについて読んだことがありますが、$ httpに関しては、すべてをURLでキャッシュします。今、私にはもっと複雑なニーズがあります:

  1. ある種のアイテム(ユーザー、記事など)のリストがあります。このリストはサーバーから取得され、キャッシュにキャッシュされます。

  2. アプリが単一のアイテムをリクエストすると、キャッシュに移動して次のようになります。

    2.1。提供されたキーを持つアイテムが存在する場合、それはキャッシュからプルします

    2.2。アイテムがキャッシュリストに存在しない場合、それはサーバーに送られ、サーバーからの応答を取得すると、このアイテムはキャッシュリストに入れられるため、次回はキャッシュからプルされます

  3. アイテムがデータベースに保存されると、キー(自動番号またはGUID)が取得され、サーバーが応答を解決するときに:

    3.1。アイテムがすでにキャッシュに存在する場合、アイテムはサーバーデータとマージ/拡張されます

    3.2。アイテムがキャッシュに存在しない場合は、単にリストに追加されます

  4. アプリケーションは、(他のユーザーによって作成された)リストに新しい/更新/削除されたアイテムがあるかどうかを(10秒ごとに)チェックし、更新する必要があります(現在のユーザーの作業に大きな影響を与えることなく)

これで、1〜3は簡単で、4は手動で開始するか、タイマーを設定する必要があります。

さらに複雑なのは、クエリの組み合わせの数に制限がない場合の検索の処理方法です。

私はこれらすべてを開発する方法を知っていますが、AngularJsまたは一般的にjavascriptとajax呼び出しのための実証済みのソリューションがあるかどうか疑問に思っています。

4

2 に答える 2

9

そのためには、おそらく独自のサービスを作成する必要があります。

のようなもの(これをバックアップするサーバーがないため、疑似コード)...

app.factory('andrejsSuperAwesomeService', ['$cacheFactory', '$http', function($cacheFactory, $http) {

   //get your cache ready.
   var userCache = $cacheFactory('users');

   // start an interval to check for data.
   // TODO: add a public function to turn this on and off.
   setInterval(function(){
       //check for changes to the data.
       $http.get('/Get/New/User/Changes')
            .success(function(changes) {
                 if(!changes) return;
                 //we'll assume we get some collection of changes back,
                 // with some change type and the user data.
                 for(var i = 0; i < changes.length; i++) {
                      var change = changes[i];
                      switch(change.changeType) {
                          case 'delete':
                             // okay just remove the deleted ones.
                             userCache.remove(change.user.id);
                             break;
                          case 'addUpdate':
                             // if it's added or updated, let's just 
                             // remove and re-add it, because we can't know what
                             // we already have or don't have.
                             userCache.remove(change.user.id);
                             userCache.put(chnage.user.id, change.user);
                             break;
                      }
                 }
            });
   }, 10000); // every 10 secs
   return {
      users: {
           //a function to get a user. 
           get: function(userId, callback) {
               var user = userCache.get(userId);

               if(!user) {
                     //the user is not in the cache so let's get it.
                     $http.get('/Uri/To/Get/A/User?userId=' + userId)
                        .success(function(data) {
                           //great, put it in the cache and callback.
                           userCache.put(userId, data);
                           if(callback) callback(data);
                        });
               } else {
                     //we already have the user, callback.
                     if(callback) callback(data);
               }
           }
      }
   };
});

次に、コントローラーでサービスを注入し、次のように使用します。

andrejsSuperAwesomeService.users.get(12345, function(user) {
       //do something with user here.
       alert(user.name + ' is a naughty user!');
});
于 2012-10-22T18:06:51.010 に答える
0

私が見る限り、誰もこれを作成していませんでした。追加したい場合は、必ず fork して pull request してください。

https://github.com/learnist/angular-cache-proxy

于 2015-01-27T20:26:30.477 に答える