2

Firebaseデータベースからデータを取得しようとしています。Firebase Storageから対応するイメージを取得しようとしています。問題は、私の見解がデータでそれ自身を更新したくないということです。更新されたスコープ変数がビューで表示されません。約束していません

データベースからデータを単に取得しようとすると、完全に機能します。私は、スコープ変数をただちに見て、$ scope.friendsinfoが更新されるのを待たずにピクチャを取得する機能(少し時間がかかる)を追加したようです。私は私の約束に間違ったことをしていると思うし、$ qを使うべきだと思いますが、どのように正確にわかりません。誰かがこれについて最善の方法は何だろうと教えてくれますか?どうもありがとう!

var friendsRef = firebase.database().ref('friendships/' + firebase.auth().currentUser.uid); 

$scope.friends = $firebaseArray(friendsRef); 

$scope.friendsinfo = []; 

$scope.$watch('friends', function() { 
    var newfriends = $scope.friends; 
    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 picPromise = fetchPicture(profilePicRef); 

     var newfriendid = newfriends[i].$id; 
     var newfriendagreed = newfriends[i].agreed; 

     picPromise.then(function(data){ 
      ref.once('value', function(snapshot){ 
       newfriendsinfo.push({ 
        id: newfriendid, 
        name: snapshot.val().name, 
        email: snapshot.val().email, 
        agreed: newfriendagreed, 
        profilepicture: data //This is the functionality that causes my view to not display the updated $scope.friendsinfo because it takes too long. 
       }); 
      }); 
     }); 
    } 
    $scope.friendsinfo = newfriendsinfo; 
    alert($scope.friendsinfo.length); 
}, true); 

function fetchPicture(ref){ 
    return ref.getDownloadURL().then(function(url) { 
     return url; 
    }).catch(function(error) { 
     alert("error"); 
    }); 
} 

答えて

0

私が正しくあなたのコードを持っていますが、どのように解決のアプローチとの約束を使用することを案内するだろうコードを掲示していない:誰もが今までのソリューションを必要とする場合

function asyncGreet(name) { 
    var deferred = $q.defer(); 

    setTimeout(function() { 
    deferred.notify('About to greet ' + name + '.'); 

    if (okToGreet(name)) { 
    deferred.resolve('Hello, ' + name + '!'); 
    } else { 
     deferred.reject('Greeting ' + name + ' is not allowed.'); 
    } 
    }, 1000); 

    return deferred.promise; 
} 

var promise = asyncGreet('Robin Hood'); 
promise.then(function(greeting) { 
    alert('Success: ' + greeting); 
}, function(reason) { 
    alert('Failed: ' + reason); 
}, function(update) { 
    alert('Got notification: ' + update); 
}); 
0

、ここにあります。問題は、主にforループが終了するのを待つことによって引き起こされ、その期間は各項目が別の関数が終了するのを待つことが原因です。これで私はそれを解決できました。おそらく最適ではありませんが、今のところそれがあります:)

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 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 picPromise = fetchPicture(profilePicRef); 

     var newfriendid = newfriends[i].$id; 
     var newfriendagreed = newfriends[i].agreed; 

     picPromise.then(function(data){ 
      ref.once('value', function(snapshot){ 
       newfriendsinfo.push({ 
        id: newfriendid, 
        name: snapshot.val().name, 
        email: snapshot.val().email, 
        agreed: newfriendagreed, 
        profilepicture: data 
       }); 
      }).then(function(){ 
       if (newfriendsinfo.length == newfriends.length){ 
        deferred.resolve(newfriendsinfo); 
       } 
      }); 
     }); 
    } 

    return deferred.promise; 
} 
関連する問題