Javascript angularjs中工厂方法的空数组

Javascript angularjs中工厂方法的空数组,javascript,angularjs,sqlite,ionic-framework,factory,Javascript,Angularjs,Sqlite,Ionic Framework,Factory,场景:我有一个具有以下代码的工厂服务 appServices.factory('MyDB', function ($cordovaSQLite) { var FixedCache = []; return { getFromCache: function (dataURL, $scope) { var query = "SELECT * FROM FixedCache WHERE URI_ID = '"+dataURL+"'";

场景:我有一个具有以下代码的工厂服务

appServices.factory('MyDB', function ($cordovaSQLite)
{      
var FixedCache = []; 

return {

    getFromCache: function (dataURL, $scope)
    {
        var query = "SELECT * FROM FixedCache WHERE URI_ID = '"+dataURL+"'";
        FixedCache = [];    
        $scope.dataFromCache = [];        

        //console.log("Inside Cache method");
        // Execute query statement from query variable.
        $cordovaSQLite.execute(db, query).then(function (res)
        {                
            if (res.rows.length > 0)
            {


                        var dataItem = {
                            id          : res.rows.item(0).id           ,
                            URI_ID      : res.rows.item(0).URI_ID    ,
                            ExpireDate  : res.rows.item(0).ExpireDate     ,
                            JSONData    : res.rows.item(0).JSONData                            
                        };                            

                        FixedCache.push(dataItem);  
                        $scope.dataFromCache = FixedCache;                            


            }



        }); 

        return FixedCache;

    },// End select all data.        
};
})

在控制器中,我希望通过调用此方法来获取数据。这是控制器的代码

appControllers.controller('categoriesCtrl', function ($scope, $http, $state, $timeout, $stateParams, $ionicHistory, MyDB, UtilityMethods) {

var dataURL = window.globalVariable.constants.URL_API;

$scope.initialForm = function () {


    $scope.categoriesFromCache = [];
    $scope.categoryCache;


    $scope.url = window.globalVariable.constants.URL_API;
    $scope.todaysDate = UtilityMethods.GetDate(0);

    // $scope.isLoading is the variable use for loading.
    $scope.isLoading = false;           

    $scope.apiUrl = window.globalVariable.constants.URL_API;


};// End initialForm.


$scope.GetFromCache = function (uri, $scope) {


    $scope.dataFromCache = [];        

    MyDB.getFromCache(uri, $scope);              
};

$scope.navigateTo = function (targetPage, objectData, apiUrl) {

    $state.go(targetPage, {
        category: objectData,
        apiUrl: apiUrl
    });
};



$scope.clearSearch = function() {
    $scope.searchByName = '';
};


$scope.goBack = function () {
    $ionicHistory.nextViewOptions({
        disableBack: true
    });
    $state.go("app.categories", {
        isShowError: false
    });
};

$scope.initialForm();


   $timeout(function () {            
        $scope.GetFromCache(dataURL, $scope);


    }, 3000);// End loading progress.
}))

问题: 当我调用这个方法MyDB.getFromCache(uri,$scope)时;在控制器中,它返回空数组[] 数据库不包含这些数据


请引导我。调用函数是否正确?

代码不起作用的原因是,您正在考虑异步事件以同步方式工作,但我想说的是,将
$scope
作为参数传递给工厂方法并不被视为良好做法

基本上,您需要做的是从控制器内承诺的方法和链返回cordova
promise
,并在其中设置范围变量

工厂

getFromCache: function(dataURL) {
  var query = "SELECT * FROM FixedCache WHERE URI_ID = '" + dataURL + "'";
  FixedCache = [];
  //returning cordova promise
  return $cordovaSQLite.execute(db, query).then(function(res) {
    if (res.rows.length > 0) {
      var dataItem = {
        id: res.rows.item(0).id,
        URI_ID: res.rows.item(0).URI_ID,
        ExpireDate: res.rows.item(0).ExpireDate,
        JSONData: res.rows.item(0).JSONData
      };

      FixedCache.push(dataItem);
      return FixedCache; //return data to chained promise
    }
  });
}
控制器

$scope.GetFromCache(dataURL).then(function(data){                
     $scope.dataFromCache = data;
});

代码不起作用的原因是,您正在考虑异步事件以同步方式工作,尽管我想说的是,将
$scope
作为参数传递给工厂方法并不是一种好的做法

基本上,您需要做的是从控制器内承诺的方法和链返回cordova
promise
,并在其中设置范围变量

工厂

getFromCache: function(dataURL) {
  var query = "SELECT * FROM FixedCache WHERE URI_ID = '" + dataURL + "'";
  FixedCache = [];
  //returning cordova promise
  return $cordovaSQLite.execute(db, query).then(function(res) {
    if (res.rows.length > 0) {
      var dataItem = {
        id: res.rows.item(0).id,
        URI_ID: res.rows.item(0).URI_ID,
        ExpireDate: res.rows.item(0).ExpireDate,
        JSONData: res.rows.item(0).JSONData
      };

      FixedCache.push(dataItem);
      return FixedCache; //return data to chained promise
    }
  });
}
控制器

$scope.GetFromCache(dataURL).then(function(data){                
     $scope.dataFromCache = data;
});

@我很高兴能帮助你,谢谢:-)我真的很高兴我得到了答案。我是Angularjs的新手。从工厂提取数据时,仍然使用加载程序:)正在处理它。这里的加载程序是什么意思?从DB加载数据时,至少需要一秒钟左右的时间。另外,当通过http请求获取数据时,需要几秒钟的时间,因此需要在请求期间显示加载程序。你们是如何得到关于堆栈溢出的问题的通知的。我很快得到了你的答复。@Abubaker很高兴帮助你,谢谢:-)我真的很高兴得到了答案。我是Angularjs的新手。从工厂提取数据时,仍然使用加载程序:)正在处理它。这里的加载程序是什么意思?从DB加载数据时,至少需要一秒钟左右的时间。另外,当通过http请求获取数据时,需要几秒钟的时间,因此需要在请求期间显示加载程序。你们是如何得到关于堆栈溢出的问题的通知的。我很快得到你的答复。