我在显示用户已添加书签的项目时遇到问题。
获取书签的代码如下:
app.factory('API', function($firebaseArray, $firebaseObject, FBURL, $q) {
var ref = new Firebase(FBURL);
/*
Called to retrieve the list of items bookmarked
*/
API.getBookmarks = function(userID) {
var defer = $q.defer();
var query = ref.child('Users').child(userID).child('bookmarkedItems');
$firebaseArray(query).$loaded(function(data) {
var bookmarks, i, itemKey;
i = 0;
bookmarks = {};
while (i < data.length) {
itemId = data[i].$id;
bookmarks[itemKey] = API.getSingle(itemId);
i++;
}
defer.resolve(bookmarks);
});
return defer.promise;
};
/*
Called to retrieve the items in the bookmark list
*/
API.getSingle = function(itemId) {
var defer = $q.defer();
var query = ref.child('Items').child(itemId);
$firebaseObject(query).$loaded(function(data) {
defer.resolve(data);
});
return defer.promise;
};
return API;
});
问题是API.getBookmarks(&#39; someUserId&#39;)正在向我返回附加到每个项目的承诺列表。$ id而不是项目&#39;数据。因此,问题来自于我使用asycnhronous函数,但似乎我在适当的地方使用defer和$ loaded来处理这些问题。
有没有人知道如何解决它?
另外,并不完全相关,但我想要注意,在我刚刚从AngularFire 0.9x更新到1.1.1之前,此操作完全正常,changelog注意到firebaseArray $ loaded函数解决的一些问题在此之前。
答案 0 :(得分:0)
只是看看这段代码它也不会预先工作,因为你的getSingle函数无论版本号如何都会返回一个promise。如果您不希望返回承诺......您将不得不处理:
API.getBookmarks = function(userID) {
var defer = $q.defer();
var query = ref.child('Users').child(userID).child('bookmarkedItems');
$firebaseArray(query).$loaded(function(data) {
var bookmarks, i, itemKey;
i = 0;
bookmarks = {};
while (i < data.length) {
(function(itemId){
API.getSingle(itemId)
.then(function(data){
bookmarks[itemKey] = data;
});
})(data[i].$id);
i++;
/*itemId = data[i].$id;
bookmarks[itemKey] = API.getSingle(itemId);
i++;*/
}
defer.resolve(bookmarks);
});
return defer.promise;
};
旁注:您的书签对象中只有一个键,因为您似乎永远不会更新itemKey