我是Javascript和AngularJS的新手,我试图解决这个问题。 我做了一个角度服务,执行数据库查询并返回承诺。
executeStatement = function(db, sql, values, onsuccess, onerror) {
if (!!db.executeSql) {
return db.executeSql(sql, values || [], onsuccess, onerror);
} else {
return db.transaction(function(tx) {
return tx.executeSql(sql, values, function(ignored, rs) {
return onsuccess(rs);
}, function(ignored, error) {
return onerror(error);
});
});
}
};
this.executeStatement = function(sql, values) {
$ionicPlatform.ready( function() {
return new Promise(function(resolve, reject) {
return executeStatement(myDB, sql, values, resolve, reject);
});
} );
}
然后如果我在角度服务模块中调用executeStatement。
this.extract = function(callback) {
_DB.executeStatement('SELECT * FROM FRIDGE', []).then(callback);}
在功能运行完毕后,这不应该返回一个承诺吗? 我未定义:( 一些帮助将不胜感激!
答案 0 :(得分:1)
this.executeStatement()
函数需要返回$ionicPlatform.ready()
的结果:
this.executeStatement = function(sql, values) {
return $ionicPlatform.ready( function() {
return new Promise(function(resolve, reject) {
return executeStatement(myDB, sql, values, resolve, reject);
});
} );
}
现在您可以访问回调中executeStatement
返回的任何内容,您可以将其作为参数传递给.then()
函数:
_DB.executeStatement('SELECT * FROM FRIDGE', []).then(callback);
答案 1 :(得分:0)
executeStatement
中的函数不是Promise
,不需要return
,onFulfilled
,onRejected
Promise
构造函数作为参数传递给函数,如果调用onsuccess
,onerror
,则原始Promise
将被解析或拒绝。
将第二个参数包含到已链接的.then()
或使用.catch()
来处理Promise
链中的潜在错误。
不确定$ionicPlatform.ready
是否会返回Promise
?
_executeStatement = function(db, sql, values, onsuccess, onerror) {
if (!!db.executeSql) {
// `onsuccess` or `onerror` need to be called for `Promise`
// to be fullfiled; a value needs to be passed to
// `onsuccess` or `onerror` to get the value at `.then()` or `.catch()`
db.executeSql(sql, values || [], onsuccess, onerror);
} else {
db.transaction(function(tx) {
tx.executeSql(sql, values, function(ignored, rs) {
onsuccess(rs);
}, function(ignored, error) {
onerror(error);
});
});
}
};
this.executeStatement = function(sql, values) {
return $ionicPlatform.ready( function() {
return new Promise(function(resolve, reject) {
_executeStatement(myDB, sql, values, resolve, reject);
})
.catch(function(err) {
// handle, pass error here
console.log(err);
return err
})
});
}
this.executeStatement(/* parameters */)
.then(function success(data) {
console.log(data);
}, function err(err) {
console.log(err);
});