2016-12-21 7 views
1

これを一般的なものにしようとすると、他の人を助けることができます。この質問は、私が約束のコンセプトに苦しんでいるほどです。Firebaseクエリー後の約束を返す

私はブール変数の値を返す関数を持っています。私のアイデアは、Firebaseからデータを取り出すことです。そして、値をループしていました...見つかったら変数をtrueに設定します。

私が実行していた問題は、ForEachループとクエリが完了したかどうかにかかわらず、値が返されることでした。私は(下記のコードsnippitに)

export function CheckIfFriendsPending(id2){ 
    var userID = getFirebase().auth().currentUser.uid 
    var indicator = false 

    var retri = function() 
    { 
      getFirebase().database().ref('members/' + userID + '/PendingFR').once('value').then(function(snap) { 
        console.log("~~~~~~~~~~~~~~~~~~go") 

        //if(result.hasOwnProperty('install_type')) 
        snap.forEach(function(childSnapshot) { 

         var childObject = childSnapshot.val() 
         if(childObject.hasOwnProperty('From')){ 
          alert("OKAY") 
          if(childObject.From == userID && childObject.To == id2){ 
           indicator = true 
          } else if(childObject.From == id2 && childObject.To == userID){ 
           indicator = true 

          } 
         } 

        }); 


       })       
    } // end retri 

    Promise.all(retri).then(function() { 
     return indicator 
    }) 
} 

誰もがこれをアプローチする方法のための任意のアイデアを持ってそれを正しく返すように解決する約束のいくつかの並べ替えを使用しようとしましたか?私はを要約したバージョン質問は、すでに約束を返す関数(私はfirebaseデータベースのquerysが行うと信じている)内で約束を作成する方法です。私はそれが完全に解決するために "ForEach"ループを待たなければならないと思います。

答えて

6

私はCheckIfFriendsPendingPromiseを返すべきだと思う:

export function CheckIfFriendsPending(id2) { 
    return new Promise(function (resolve, reject) { 
    var userID = getFirebase().auth().currentUser.uid; 
    var indicator = false; 
    getFirebase().database().ref('members/' + userID + '/PendingFR').once('value') 
     .then(function (snap) { 
     function userMatch(user) { 
      if (!!user.From && user.From === userID && (user.To === id2 || user.To === userID)) { 
      return resolve(); 
      } 
     } 
     snap.forEach(function (childSnapshot) { 
      var childObject = childSnapshot.val(); 
      userMatch(childObject); 
     }); 
     return reject(); 
     }); 
    }); 
} 

次にあなたが呼び出すことができます。

CheckIfFriendsPending(id2) 
    .then(function() { console.log('Yes'); }) 
    .catch(function() { console.log('No'); }); 

をここでは簡単な作業exampleです。

+0

うわー、ありがとう@ adrice727、はるかに良い解決策です... –

+0

ありがとう、あなたは私の日を救った! – user1892203