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