如果您之前曾问过这个问题,或者是一个简单的问题,但我对此并不陌生。
我的服务中有这样的功能
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;
});
},
它的工作是建立一个没有名字的房间列表。我需要等待for循环完成,以便在继续之前检查所有房间,因此$q
。
然后我需要在控制器中调用函数并返回结果。
当我在控制器中调用函数时,就像这样
console.log(SyncService.checkRoomNameStatus());
它返回以下对象
哪个很棒,但是如何从中获取值数组呢?
我知道这与诺言被退回的方式有关,但我无法完全兑现!
我尝试了以下方法
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);
})
但是我似乎无法在我的控制器中访问该值数组!有人可以解释我要去哪里哪里以及我应该如何正确解决这个问题吗?
提前谢谢!
答案 0 :(得分:0)
我认为您对$q.all
的工作方式感到困惑。一旦所有承诺均已解决,您现在可以在then
调用的$q.all
块中访问已解决承诺的每个值。该then
调用有一个参数,它是一组解析值。这是一个示例:
$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);
})
这是一个简单的插件,说明了它是如何工作的:
答案 1 :(得分:0)
要通过基于回调的API创建承诺,请使用$q.defer:
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;
},
然后使用.then
方法提取结果:
SyncService.checkRoomNameStatus().then(function(allvalues){
console.log(allvalues);
})
有关更多信息,请参见AngularJS $q Service API Reference
答案 2 :(得分:-1)
something like that:
this.SyncService.checkRoomNameStatus().subscribe(data => {
console.log(data);
}, error => { alert("data not found"); });