承诺不会返回对象数组

时间:2016-05-05 15:15:56

标签: javascript angularjs firebase promise

我正在使用带有Firebase的angularJs。 要从firebase检索数据,请使用以下代码。

Controller.js

$scope.load_msg=function(){
  $scope.msg=[];
  Chat.load_msg($scope.name,$scope.user.profile.name).then(function(arr){
    $scope.msg=arr;
    console.log($scope.msg);
  },function(error){
    console.log(error);
  });
}

Service.js

load_msg:function(name,frm){
  var deferred = $q.defer();
  var sref=ref.child('/Chats/'+frm);
  var rref=ref.child('Chats/'+name);
  var msgArray=[];
  ref.orderByChild("to").equalTo(name).once('child_added',function(messages){
    msgArray=msgArray.concat(messages.val());
    deferred.resolve(msgArray);
  },function(error){
    deferred.reject(error);
  });
return deferred.promise;
}

msgArray包含on()查询的所有元素,但回到控制器arr只查询第一个对象。如何通过promise发送整个数组msgArray

2 个答案:

答案 0 :(得分:0)

问题在于:

load_msg:function(name,frm){
  var msgArray=[]; //You reset the array every time the function is called!!
  ref.orderByChild("to").equalTo(name).once('child_added',function(messages){
    msgArray=msgArray.concat(messages.val());
    deferred.resolve(msgArray);
  });
return deferred.promise;
}

将此更改为以下内容:

ServiceFunction() {
  var msgArray = [];
  return {
    load_msg:function(name,frm){
  ref.orderByChild("to").equalTo(name).once('child_added',function(messages){
      msgArray=msgArray.concat(messages.val());
      //deferred resolve etc...
    });
  }
}

答案 1 :(得分:0)

你正在使用.once('child_added',它只会触发一次:第一个子项目。

使用on('child_added'once('value'。由于您调用了参数messages,因此您可能正在寻找后者:

ref.orderByChild("to").equalTo(name).once('value',function(messages){
  messages.forEach(function(message) {
    msgArray.push(message.val());
  });
  deferred.resolve(msgArray);
},function(error){
  deferred.reject(error);
});