如何处理调用另一个异步代码的异步代码[AngularJs]

时间:2013-11-10 14:30:45

标签: javascript angularjs asynchronous

我的工厂使用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中的函数。我不知道问题在哪里。

3 个答案:

答案 0 :(得分:3)

我们可以使用保证链来使其发挥作用。

(我没有数据库所以我用$q)模拟了异步响应和包装数据

演示 Fiddle

fessmodule.controller('fessCntrl', function ($scope, RecipesStorage) {

    $scope.alertSwap = function () {
       RecipesStorage.getDb()
                        .then(function (result) {
                           $scope.data = result;                           
                        }, function (result) {
                            alert("Error: No data returned");
                        });
    }

});

fessmodule.$inject = ['$scope', 'RecipesStorage'];

fessmodule.factory('RecipesStorage', ['$q', function ($q) {

    var getDb = function () {        
        var data = [{
            "PreAlertInventory": "5.000000",
            "SharesInInventory": "3.000000"
        } ];   
        var deferred = $q.defer();
        deferred.resolve(data);
        return getRecipe(data);        
    };

    var getRecipe = function(db){    
        var data = [{        
            "TotalSharesBought": "0.000000",
            "TotalShareCost": "0.000000",
            "EstimatedLosses": "0.000000"
        }]; 
        db.push(data[0]);
        var deferred = $q.defer();
        deferred.resolve(db);
        return deferred.promise;
    }

    var factory = {
        getDb: getDb
    };

    return factory;
}]);

参考

enter image description here

  • 您可以链接承诺以创建代码流
  • 错误传播,因此您可以在链的末尾捕获它

enter image description here

答案 1 :(得分:0)

我在代码中看不到问题。也许this plunker可以帮助您找出问题所在。我根据你的代码创建它,它显然有用。

答案 2 :(得分:0)

真正的问题是在我的版本中我在版本1.0.8中使用了角度,但是当我将其切换到版本1.2.0时,它开始按预期工作。谢谢:))