从服务功能中获取$$ state值

时间:2018-10-12 08:36:27

标签: javascript angularjs

如果您之前曾问过这个问题,或者是一个简单的问题,但我对此并不陌生。

我的服务中有这样的功能

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());

它返回以下对象

enter image description here

哪个很棒,但是如何从中获取值数组呢?

我知道这与诺言被退回的方式有关,但我无法完全兑现!

我尝试了以下方法

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);
})

但是我似乎无法在我的控制器中访问该值数组!有人可以解释我要去哪里哪里以及我应该如何正确解决这个问题吗?

提前谢谢!

3 个答案:

答案 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);
})

这是一个简单的插件,说明了它是如何工作的:

https://plnkr.co/edit/xSdi3WS3nlW9ib1QSGRd

答案 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"); });