如果可能,我需要一些有關promise的幫助。我是AngularJS的新手,不知道如何處理我遇到的問題。基本上,問題是我有兩個不同的數組,它們是異步初始化的,最終將兩個數據存儲在同一個數組中,並在多個項目的for-loop中執行此操作。我遇到的錯誤是當它加載正確數量的項目時,它顯示所有不同的用戶數據,但不是一個不同的圖片。所顯示的圖片對於每個條目都是相同的。在整個代碼部分的末尾,您會發現:用承諾循環獲取firebase對象
userPromise.then(function(user){
picPromise.then(function(url){
newfriendsinfo.push({
id: newfriendid,
name: user.val().name,
email: user.val().email,
agreed: newfriendagreed,
profilepicture: url
});
}).then(function(){
if (newfriendsinfo.length == newfriends.length){
deferred.resolve(newfriendsinfo);
}
});
});
我確定這是我的問題所在。它在不使用新圖片的情況下查找新的用戶數據。但是,我不知道我該如何處理這個問題。我研究了多個延遲變量和$ q.all,但我不太明白我應該如何解決這個問題。您可以在下面找到完整的相關代碼。非常感謝您的幫助:)
var friendsRef = firebase.database().ref('friendships/' + firebase.auth().currentUser.uid);
$scope.friends = $firebaseArray(friendsRef);
$scope.friendsinfo = [];
$scope.$watch('friends', function() {
var newfriends = $scope.friends;
asyncUpdateFriendsInfo(newfriends).then(function(newlist){
$scope.friendsinfo = newlist;
});
}, true);
function fetchPicture(ref){
return ref.getDownloadURL().then(function(url) {
return url;
}).catch(function(error) {
alert("error");
});
}
function fetchUserInfo(ref){
return ref.once('value', function(snapshot){
}).then(function(snapshot){
return snapshot;
});
}
function asyncUpdateFriendsInfo(newfriends){
var deferred = $q.defer();
var newfriendsinfo = [];
for(var i = 0; i < newfriends.length; i++){
var ref = firebase.database().ref('users/' + newfriends[i].$id);
var profilePicRef = firebase.storage().ref("profilepictures/" + newfriends[i].$id + "/profilepicture");
var userPromise = fetchUserInfo(ref);
var picPromise = fetchPicture(profilePicRef);
var newfriendid = newfriends[i].$id;
var newfriendagreed = newfriends[i].agreed;
userPromise.then(function(user){
picPromise.then(function(url){
newfriendsinfo.push({
id: newfriendid,
name: user.val().name,
email: user.val().email,
agreed: newfriendagreed,
profilepicture: url
});
}).then(function(){
if (newfriendsinfo.length == newfriends.length){
deferred.resolve(newfriendsinfo);
}
});
});
}
return deferred.promise;
}
避免[遞延反模式(HTTP:/ /stackoverflow.com/q/23803743/1048572)! – Bergi
「*'if(newfriendsinfo.length == newfriends.length)'*」是[not going to work](http://stackoverflow.com/a/40032582/1048572)。爲什麼不簡單地使用'$ q.all'? – Bergi