Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从服务函数获取$$状态值_Javascript_Angularjs - Fatal编程技术网

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))数据库服务
实现是什么样子的,所以我不能真正回答这个问题。如果它返回承诺,您可以直接将它们放入承诺数组中。否则,您需要创建自己的延迟对象,并使用
数据库服务中的数据解析或拒绝它。愚蠢的问题,如果您有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);
})