2

indexedDB を使用しているファクトリと、データを受信するためにこのインデックス付きデータベースを必要とするメソッド getRecipe があります。

問題は、indexedDB が非同期呼び出しでインスタンスを返し、getRecipe が非同期呼び出しで値を返す別のメソッドであることです。

私は約束を介してそれを解決しようとしましたが、失敗しました。

app.factory('RecipesStorage', ['$q', function($q) { 
var getDb = function () {
   var deferred = $q.defer();

   var db;
   var request = indexedDB.open('recipes', 1);

   request.onupgradeneeded = function (e) {
       console.log('Upgrading indexedDb');
       var thisDb = e.target.result;

       if (!thisDb.objectStoreNames.contains('recipe')) {
           thisDb.createObjectStore('recipe');
       }
   }

   request.onsuccess = function (e) {
       db = e.target.result;
       window.db = db;
       deferred.resolve(db);
   }

   request.onerror = function (e) {
       console.error('Error when opening indexedDB');
   }

   return deferred.promise;
};

var getRecipe = function (recipeId, callback) {
        getDb().then(function(db) {
            var transaction = db.transaction(['recipe'], 'readonly');
            var objectStore = transaction.objectStore('recipe');

            var data = objectStore.get(recipeId);

            data.onsuccess = function (e) {
                var result = e.target.result;
                console.log('GetRecipe:', result);
                callback(result);
            }

            data.onerror = function (e) {
                console.error('Error retrieving data from indexedDB', e);
            }
        });
};

return {getRecipe:getRecipe};
}]);

しかし、これは機能しません。getRecipe では、 then の関数は呼び出されません。どこに問題があるのか​​わからない。

4

3 に答える 3

0

あなたのコードに問題は見当たりません。たぶん、このプランカーは問題がどこにあるかを理解するのに役立ちます. あなたのコードに基づいて作成しましたが、明らかに動作します。

于 2013-11-10T15:34:08.853 に答える
0

本当の問題は、私のバージョンではバージョン 1.0.8 で angular を使用していたことですが、それをバージョン 1.2.0 に切り替えると、期待どおりに動作し始めたことです。ありがとう :)

于 2013-11-11T18:54:24.283 に答える