가능한 경우 약속에 대한 도움이 필요합니다. 나는 AngularJS에 처음 왔고 내가 겪고있는 문제를 어떻게 다룰 지 알 수 없습니다. 기본적으로 두 개의 서로 다른 배열이 비동기식으로 초기화되는 반면 궁극적으로 두 배열을 같은 배열에 저장하고 for 루프에서 여러 항목을 저장합니다. 내가 만나는 버그는 정확한 양의 항목을로드하는 동안 다른 사용자 데이터를 모두 표시하지만 다른 그림은 표시하지 않는다는 것입니다. 표시되는 그림은 각 항목에 대해 동일합니다. 전체 코드 섹션의 끝 부분에서 다음을 찾으십시오.약속을 지닌 루프에서 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)'* '는 [작동하지 않을 것입니다] (http://stackoverflow.com/a/40032582/1048572). 왜 단순히'$ q.all '을 사용하지 않는가? – Bergi