使用延迟和问题的问题$ loaded以检索用户已添加书签的项目

时间:2015-05-24 23:01:35

标签: angularjs firebase angularfire

我在显示用户已添加书签的项目时遇到问题。

获取书签的代码如下:

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函数解决的一些问题在此之前。

1 个答案:

答案 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