1

我的服务:服务功能返回undefined

var CacheService = angular.module('test.cacheService', []); 

    CacheService.service('CacheService', function($cordovaSQLite){ 
     var db = null; 

     this.InitDB = function(){ 
     db = $cordovaSQLite.openDB('my.db', 1); 
     $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS settings (key TEXT, value TEXT)"); 
     $cordovaSQLite.execute(db, "INSERT INTO settings (key, value) VALUES(?, ?)" , ['language', 'en']); 
     }; 

     this.GetCachedLanguage = function(){ 
     $cordovaSQLite.execute(db, 'SELECT * FROM settings WHERE key = "language"').then(function(result){ 
// OUTPUT DEFINED   
alert(result.rows.item(0)['value'] + ' ' + typeof result.rows.item(0)['value']); 
       return result.rows.item(0)['value']; 
      }); 
     }; 
     return this; 
    }); 

在app.js文件,离子设备上的准备我尝试使用我的服务:

var app = angular.module('test', ['ionic','ngCordova', 'test.cacheService']) 
app.run(function($ionicPlatform, CacheService) { 
    $ionicPlatform.ready(function() { 
    if(window.StatusBar) { 
     StatusBar.styleDefault(); 
    } 

    CacheService.InitDB(); 
    alert(CacheService.GetCachedLanguage()); //alert show undefined 
    }); 
}); 

所有真实设备测试(IOS)我不明白为什么这不起作用,请帮助我,我犯了一个错误?

UPDATE:

像@charlietfl说,我需要创建一个回调,对于这个功能,但我不明白,我怎么能做到这一点

+1

''GetCachedLanguage不返回任何内容和执行'()'是异步也 – charlietfl

+0

@charlietfl是啊,我得到这个,但我怎么能解决这个问题,我不知道.. – mreoer

+0

使用回调作为第二个参数。我看到你接受了答案,所以想你已经整理出来了 – charlietfl

回答

0

好的,我解决了这个问题。所以我们需要为我们的查询创建回调。我找到了这个答案here

感谢Miguel Alves的伟大工作!

database("SELECT * FROM USER", function(result){ 
    console.log(result); 
}); 

//FUNCTION 
function database(sql, callback) { 

    if(!callback) { callback = function(r) { console.log(r); } } 

    var database_name = "Database", 
     database_version = "1.0", 
     database_displayname = "DatabaseName", 
     database_size = 1000000, 
     result = { 
      error: -1, 
      message: "", 
      len: 0, 
      rows: {} 
     }, 
     db = window.openDatabase(database_name, database_version, database_displayname, database_size); 
     db.transaction(
         function (tx) { 
          tx.executeSql(sql, [], querySuccess, errorCB); 
         }, function (tx, results) { 
          //SUCCESS 
         }, function (err) { 
          //ERROR 
         } 
     ); 
     function querySuccess(tx, results) { 
      if (results) { 
       result.len = results.rows.length; 
       result.message = "Success"; 
       for (var i=0; i<result.len; i++){ 
        result.rows[i] = results.rows.item(i); 
       } 
      } else { 
       result.len = 0; 
      } 
      callback(result); 
     } 
     function errorCB(err) { 
      result.error = err.code; 
      result.message = err.message; 
      callback(result); 
     } 
} 
0

因为this.test = this.GetCachedLanguage;实际定义之前设置this.GetCachedLanguage并且在它被设置的点this.GetCachedLanguageundefined

因此,在return this;之前移动this.test = this.GetCachedLanguage;

+0

哦,现在好了它被定义了,但在输出中我看到GetCachedLanguage()函数代码..我想看看这个函数的返回值,我该如何解决它? – mreoer

+0

'alert(CacheService.test);'不调用该函数。要获得返回值,你必须调用函数alert(CacheService.test());' – mani

+0

谢谢,我只是解决它,你发布这个) – mreoer