【问题标题】:Angularfire $firebaseArray.$add() returning undefined when called in external service, not a promise as expectedAngularfire $firebaseArray.$add() 在外部服务中调用时返回未定义,而不是预期的承诺
【发布时间】:2016-04-22 12:22:28
【问题描述】:

我已经使用 Angular + AngularFire + Firebase 建立了一个小型应用程序。这是我的版本:

角度:1.4.3 火力基地:2.2.4 角火:1.1.3

我有多个角度服务: -Trip 服务:直接连接到 firebase,并且是唯一使用 angularfire 对象($firebaseArray、$firebaseObject)的服务。这是代码:

trvlApp.service('tripSvc', function($firebaseArray, $firebaseObject, constants) {

  // create ref to /trips data in firebase. base url stored in constants 
  var rootRef = new Firebase(constants.fbBaseUrl + '/trips/');

  var getTripsArray = function(uid) {
    return $firebaseArray(rootRef.child(uid));
  };

  this.addTripForUser = function(uid, tripObj) {
    var trips = getTripsArray(uid); // get trips for uid
    trips.$loaded() // when trips array is loaded
    .then(
      function(response) {
        return trips.$add(tripObj); // return promise of adding trip
      }
    );
  };

-mytripsOps:另一个从tripSvc 中提取/处理数据并将数据传递给控制器​​的服务。此服务不使用 $firebaseObject 或 $firebaseArray。该服务中的相关方法如下所示:

trvlApp.service('mytripsOps', function(tripSvc) {

  this.addCompletedTripForUser = function(uid, tripObj) {
    tripSvc.addTripForUser(uid, tripObj) // should return promise, instead returns undefined
      .then(
        function(response) {
          console.log("Completed trip added.", response);
        }
      );
  };
});

在后一种服务中,当 .then() 方法尝试执行时,会抛出“无法读取未定义的 .then 属性”错误,这意味着在 mytripsOps 中调用 tripSvc.addTripForUser 并没有按预期返回 Promise .

其他几点说明: - $add 方法在tripSvc 本身中调用时会正确返回一个promise。 -我可以通过在 tripSvc.addTripForUser 中创建我自己的承诺并在 $add 解决时解决它来为此创建一个解决方法,但这似乎是过度的。 - 在tripSvc.addTripForUser 中,我还尝试先调用trips.$add(tripObj),然后返回$trips.$save(),但这产生了相同的结果。 -tripSvc 中的其他方法返回 angularfire 承诺(例如,返回 $tripObj.$save()),并且在其他服务中调用这些方法时确实会返回这些承诺。

所以,问题是:为什么当我在 mytripsOps 中调用 tripSvc.addTripForUser 时返回的是“未定义”,而不是一个承诺? AngularFire 的文档非常清楚地表明 $add() 应该返回一个承诺:

https://www.firebase.com/docs/web/libraries/angular/api.html#angularfire-firebasearray-addnewdata

感谢您提前提供的帮助,我对 Angular 和 Firebase 还比较陌生,而这个让我发疯了。

【问题讨论】:

    标签: angularjs firebase angularfire


    【解决方案1】:

    经过一番修改,我找到了解决方案。为了从tripSvc 中的addTripForUser 函数返回promise,我需要返回整个$trips.loaded 块:

     this.addTripForUser = function(uid, tripObj) {
        var trips = getTripsArray(uid); // get trips for uid
     // NOTE THE NEW RETURN ON THE LINE BELOW   
     return trips.$loaded() // when trips array is loaded
        .then(
          function(response) {
            return trips.$add(tripObj); // return promise of adding trip
          }
        );
      };
    

    通过返回整个 trips.$loaded() 块,我能够在单独的 mytripsOps 服务中访问 addTripForUser 返回的承诺,并在其上调用 .then()。

    【讨论】:

      猜你喜欢
      • 2016-08-17
      • 2015-06-13
      • 2020-12-23
      • 2019-06-09
      • 2014-11-24
      • 1970-01-01
      • 2015-01-30
      • 2015-09-27
      相关资源
      最近更新 更多