2015-05-24 18 views
0

我在顯示用戶加書籤的項目時遇到問題。

的代碼來獲取書籤如下:。

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(「someUserId」)將返回我連接到每一個項目的承諾清單的$ id而不是項目的數據。所以,這個問題是由於我使用了不同尋常的函數而引起的,但似乎我在適當的地方使用了defer和$ loaded來處理這些問題。

有沒有人有如何解決它的想法?

此外,並不完全相關,但我想說明的是,在我剛從AngularFire 0.9x更新到1.1.1之前,此操作完全正常,並且changelog注意到firebaseArray $ loaded函數在應該解決之前應解決某些問題。

+0

通過閱讀代碼,它確實看起來像'getBookmarks'將返回一個承諾列表。這是事實,不是問題。問題是什麼? –

+0

如果您試圖返回實際數據,那是不可能的,因爲它尚未加載。您無法在JavaScript中使異步操作同步。有關如何處理此問題,請閱讀http://stackoverflow.com/questions/27049342/asynchronous-access-to-an-array-in-firebase/27050749#27050749。 –

+0

@FrankvanPuffelen: 感謝您的幫助,但未解決的承諾是哪裏? getSingle函數在此操作之外解決完美的罰款和承諾。 此外,並不完全相關,但我想指出,此操作在我剛剛從AngularFire 0.9x更新到1.1.1和更改日誌(www.firebase.com/docs/web/libraries/angular/ changelog.html)記錄了firebaseArray $ loaded函數在它應該解析之前的一些問題。 – AJeezy9

回答

0

只是看着這段代碼,它不會事先工作,因爲你的getSingle函數返回一個承諾,無論版本號是多少。如果你不想被返回的承諾做...你必須處理:

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