Cordova SQLite вернуть обещание?
Рассмотрим этот метод в угловом сервисе:
select : function(table) {
window.sqlitePlugin.openDatabase({
name: 'smartLab.db',
location: 'default'
}, function success(db) {
var defer = window.Q.defer();
console.dir(defer);
db.executeSql('SELECT * FROM ' + table, [], function success(rows) {
var resp = [];
for(var i = 0; i < rows.rows.length; i++) {
resp.push(rows.rows.item(i));
}
defer.resolve(resp);
}, defer.reject)
}, function error(err) {
})
}
Я звоню из другой службы следующим образом:
DatabaseService.select(TBL_NAME).then(function(rows) {
// logic goes here
});
Я получаю ошибку:
Uncaught TypeError: Cannot read property 'then' of undefined
Я никогда раньше не использовал Q, но я знаком с обещаниями, что-нибудь выскакивает как неправильное? Очевидно, что-то...
2 ответа
Решение
Вы никогда не вернете обещание от защищенного объекта (нажмите здесь для получения дополнительной информации)
select : function(table) {
var defer = window.Q.defer();
window.sqlitePlugin.openDatabase({
name: 'smartLab.db',
location: 'default'
}, function success(db) {
console.dir(defer);
db.executeSql('SELECT * FROM ' + table, [], function success(rows) {
var resp = [];
for(var i = 0; i < rows.rows.length; i++) {
resp.push(rows.rows.item(i));
}
defer.resolve(resp);
}, defer.reject)
}, function error(err) {
});
return defer.promise;
}
Поскольку вы используете ионный / угловой, вы также можете использовать Promise
, Например, я использую директиву DataProvider:
public getJobs() {
return new Promise((resolve, reject) => {
this.sqlite.create({
name: this.dbName,
location: this.dbLoc
})
.then((db: SQLiteObject) => {
var query = "SELECT * FROM user_jobs WHERE user_id=(?)";
db.executeSql(query, [this.userId])
.then((resp) => {
console.log('Executed SELECT SQL:', resp.rows.length);
resolve(resp);
})
.catch(e => console.log('db.executeSql error: ', JSON.stringify(e)));
})
.catch(e => console.log('sqlite.create error: ', e));
});
}
На любой странице вы можете позвонить, легко позвонить:
this.dataProvider.getJobs().then((resp:any) => {
if (resp.rows.length > 0) {
for (var i = 0; i < resp.rows.length; i++) {
let item = resp.rows.item(i);
console.log(item);
}
}
});