Javascript 从服务函数获取$$状态值
我是个新手,所以如果以前有人问过我这个问题,或者是一个简单的问题,我会向你道歉,但我不能对它掉以轻心 我的服务中有这样一个功能Javascript 从服务函数获取$$状态值,javascript,angularjs,Javascript,Angularjs,我是个新手,所以如果以前有人问过我这个问题,或者是一个简单的问题,我会向你道歉,但我不能对它掉以轻心 我的服务中有这样一个功能 checkRoomNameStatus: function() { var promises = []; var emptyRooms = []; DatabaseService.openDB().transaction(function(tx) { tx.executeSql("SELECT * FROM report_roo
checkRoomNameStatus: function()
{
var promises = [];
var emptyRooms = [];
DatabaseService.openDB().transaction(function(tx) {
tx.executeSql("SELECT * FROM report_rooms", [], function(a,b){
for(i = 0; i < b.rows.length; i++){
console.log('B', b.rows.item(i));
if(b.rows.item(i).name == '' || b.rows.item(i).name == null){
emptyRooms.push(b.rows.item(i));
}
promises.push(b.rows.item(i).id);
}
});
});
return $q.all(promises).then(function(){
return emptyRooms;
});
},
它返回以下对象
这很好,但是如何从中获取值数组呢
我知道这与承诺的回报方式有关,但我不能完全破解它
我试过以下方法
console.log('1',SyncService.checkRoomNameStatus());
console.log('2',SyncService.checkRoomNameStatus().$$state.value);
console.log('3',SyncService.checkRoomNameStatus().value);
console.log('4',SyncService.checkRoomNameStatus().value());
SyncService.checkRoomNameStatus().then(function(value){
console.log(value);
})
但我似乎无法访问控制器中的值数组!有人能解释一下我哪里出了问题,以及我应该如何正确处理这个问题吗
提前谢谢你 我认为你对
$q.all
的工作原理感到困惑。一旦承诺全部解决,您现在就可以在$q.all
调用的then
块中访问承诺解决的每个值。then
调用中有一个参数,它是一个解析值数组。以下是一个例子:
something like that:
this.SyncService.checkRoomNameStatus().subscribe(data => {
console.log(data);
}, error => { alert("data not found"); });
$q.all(bunchOfPromises).then(function(data) {
// data is an array of resolved values (same order as the promises passed in)
console.log(data);
});
因此,您可以从您的服务中返回:
return $q.all(promises);
然后在控制器中,像您已经尝试过的那样访问您的数据:
SyncService.checkRoomNameStatus().then(function(allvalues){
console.log(allvalues);
})
下面是一个简单的plunkr,说明了这是如何工作的:
要从基于回调的API创建承诺,请使用:
有关更多信息,请参见您能否解释一下这是如何工作的?为什么我们需要使用
.subscribe
?目标是同步。订阅-侦听和等待信息,并允许程序继续运行,而不是等待信息到达。据我所知,这是在Angular 2+中访问信息的唯一方法。感谢您的帮助,我现在无法尝试此方法,但一旦有机会,我会让您知道它是否有效。谢谢@S_R看起来您正在使用的是仅在AngularJS中可用的$q
<代码>订阅是在角度>=2中使用的可观察模式的一部分。我想这对你不起作用。@james00794你能建议我如何使用AngularJS吗?承诺如何从数据库查询中获取我的数据?我是否必须更换emptyRooms.push(b.rows.item(I))代码>带有promises.push(b.rows.item(i))然后返回Promissions数组?我不知道您的数据库服务
实现是什么样子的,所以我不能真正回答这个问题。如果它返回承诺,您可以直接将它们放入承诺数组中。否则,您需要创建自己的延迟对象,并使用数据库服务中的数据解析或拒绝它。愚蠢的问题,如果您有allvalues变量,我假设我应该填充相同的变量,然后通过解析返回数组?这是正确的。制造一个承诺,以解决所需的数据。$q.defer
方法创建一个“可写”承诺。使用.resolve
方法编写数据。非常感谢,我会尽快尝试!
SyncService.checkRoomNameStatus().then(function(allvalues){
console.log(allvalues);
})
checkRoomNameStatus: function()
{
var deferred = $q.defer();
DatabaseService.openDB().transaction(function(tx) {
tx.executeSql("SELECT * FROM report_rooms", [], function(a,b){
var allvalues = <some function of (a,b)>
deferred.resolve(allvalues);
});
});
return deferred.promise;
},
SyncService.checkRoomNameStatus().then(function(allvalues){
console.log(allvalues);
})