服务函数 return 未定义
Service function return 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),我不明白为什么这不起作用,请帮助我,我哪里弄错了?
更新:
就像@charlietfl 说的,我需要为这个函数创建一个回调,但我不明白我该怎么做
因为 this.test = this.GetCachedLanguage;
是在实际定义 this.GetCachedLanguage
之前设置的,并且在设置点 this.GetCachedLanguage
是 undefined
。
所以将 this.test = this.GetCachedLanguage;
移动到 return this;
之前。
好的,我解决了这个问题。所以我们需要为我们的查询创建回调。我找到这个答案 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 );
}
}
我有服务:
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),我不明白为什么这不起作用,请帮助我,我哪里弄错了?
更新:
就像@charlietfl 说的,我需要为这个函数创建一个回调,但我不明白我该怎么做
因为 this.test = this.GetCachedLanguage;
是在实际定义 this.GetCachedLanguage
之前设置的,并且在设置点 this.GetCachedLanguage
是 undefined
。
所以将 this.test = this.GetCachedLanguage;
移动到 return this;
之前。
好的,我解决了这个问题。所以我们需要为我们的查询创建回调。我找到这个答案 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 );
}
}