【发布时间】: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