我要做的是创建一种存储服务,在其中我使用SQLite数据库存储键和值对,之后我可以根据键检索它们。为此,我设置了以下代码:
.service('StorageService', function($cordovaSQLite, $q) {
if(window.cordova) {
db = $cordovaSQLite.openDB("vouchers.db");
} else {
db = window.openDatabase("vouchers.db", "1.0", "Vouchers db", -1);
}
$cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS vouchers (key text, value text)");
return {
getItem: function(item) {
var query = "SELECT key, value FROM vouchers WHERE key = ?";
$cordovaSQLite.execute(db,query,[item]).then(function(result) {
console.log(result.rows[0].value);
return result.rows[0].value;
});
},
setItem: function(item, data) {
var query = "INSERT INTO vouchers (key, value) VALUES (?,?)";
return $cordovaSQLite.execute(db, query, [item, data]);
}
};
})
现在,大部分内容都很有效。我可以在db中存储项目,甚至可以从函数内部检索和记录它们,如下所示:
console.log(result.rows[0].value);
当我记录这个时,我得到了预期的值,但当我返回它并将其记录在我正在使用此服务的控制器中时,它仍未定义。我的控制器中的代码如下所示:
var test = StorageService.getItem("testje");
console.log(test);
请注意,没有控制台错误。只有两个日志。一个来自未定义的控制器,另一个来自按预期返回值的服务:
controllers.js:465 undefined
services.js:122 dit is een testje!
我希望有人能说出这里出了什么问题。如果有任何信息或代码可以提供帮助而我遗漏了,请告诉我。
答案 0 :(得分:0)
那是因为您的getItem: function(item) {
使用承诺来检索结果。
尝试将代码更改为此代码:
getItem: function(item) {
var query = "SELECT key, value FROM vouchers WHERE key = ?";
return $cordovaSQLite.execute(db,query,[item]);
});
以这种方式致电您的服务:
StorageService.getItem("testje").then(function(result){
console.log(result);
});
您将能够查看结果。
我建议你研究一些basic principles承诺:如果你在javascript中使用$ http get和post请求以及任何其他异步内容,你会经常遇到它们。