Получить значение состояния $$ из сервисной функции - PullRequest
0 голосов
/ 12 октября 2018

Я новичок в angular, поэтому извиняюсь, если это было задано ранее или это простой вопрос, но я не могу обернуть его вокруг.

У меня есть функция в моем сервисе, подобная этой

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 голосов
/ 12 октября 2018

Я думаю, вы путаете себя с тем, как работает $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

0 голосов
/ 12 октября 2018

Чтобы создать обещание из 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 Справочник по API службы

0 голосов
/ 12 октября 2018
something like that:
this.SyncService.checkRoomNameStatus().subscribe(data => {
           console.log(data);
  }, error => { alert("data not found"); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...