5

firebase databaseにあるリストを更新するfirebase functionは、そのリストにサブスクライブされているsubscriptionによって取得されていると思います。リストの出力が私の電話(アプリ内)のように見えるから...そして私のコンソール出力がどのようになるか(それが繰り返される方法)から、リスト全体をキャプチャして、それが追加されるたびに表示されるようです。だから、(私はこれを見上げた)...私はこの方程式は何が起こっているかを表していると信じて:firebase関数で更新されているFirebase関数の実行とサブスクリプション

(N(N + 1))/2

それはあなたが私に数学をやって1からNまでの数字のすべての合計を取得する方法であります(N = 30程度)、私は約465のエントリを取得...私はそれが最初の10をロードするだけで、トンをロードしていることを確認することができます...

出力で何が起こっているかを示すこちらはペーストビンhttps://pastebin.com/B7yitqvDです。 length - 1 load前に/上のある配列への出力注意を払うには

。毎回1つのエントリが追加されたアレイをすばやく返してリストに追加していることがわかります。私は非常に多くのアイテムが私のリストにも入っているという非常に大まかなカウントをしました、そして、私は440を得ました...そのように、およそ465の数字にマッチします。

事象の連鎖がこの機能を備えたリストのページではありませんページで始まり - firebase functions側でソートを開始する:ここで

let a = this.http.get('https://us-central1-mane-4152c.cloudfunctions.net/sortDistance?text='+resp.coords.latitude+':'+resp.coords.longitude+':'+this.username); 
this.subscription6 = a.subscribe(res => { 
console.log(res + "response from firesbase functions"); 
    loading.dismiss(); 
}, err => { 
    console.log(JSON.stringify(err)) 
    loading.dismiss(); 
}) 

はとページ上の関数でありますlist私は何らかの理由でソート全体をキャプチャしていると思います。サブスクリプションはfirebase functionのように繰り返されています。それは全体のソートをキャプチャし、それをソートするよう繰り返し、それをリストするかもしれないという別の指標を -

loadDistances() { 
    //return new Promise((resolve, reject) => { 
     let cacheKey = "distances" 
     let arr = []; 
     let mapped; 
     console.log("IN LOADDISTANCES #$$$$$$$$$$$$$$$$$$$$$"); 


     console.log("IN geo get position #$$$$$$$5354554354$$$$$$$"); 

     this.distancelist = this.af.list('distances/' + this.username, { query: { 
      orderByChild: 'distance', 
      limitToFirst: 10 
     }}); 


     this.subscription6 = this.distancelist.subscribe(items => { 
      let x = 0; 

      console.log(JSON.stringify(items) + "  length - 1 load"); 



      items.forEach(item => { 
      let storageRef = firebase.storage().ref().child('/settings/' + item.username + '/profilepicture.png'); 

       storageRef.getDownloadURL().then(url => { 
       console.log(url + "in download url !!!!!!!!!!!!!!!!!!!!!!!!"); 
       item.picURL = url; 
       }).catch((e) => { 
       console.log("in caught url !!!!!!!$$$$$$$!!"); 
       item.picURL = 'assets/blankprof.png'; 
       }); 

      this.distances.push(item); 

      if(x == items.length - 1) { 
       this.startAtKey4 = items[x].distance; 
      } 

      x++; 
      }) 

      //this.subscription6.unsubscribe(); 
     }) 

    } 

subscriptionloadDistances内の関数は、限り、私は他のページからリストを更新しないと正常に動作します。

私は更新後にリストからunsubscribeを考えてみました...更新した直後ではなく、リストが入った次回のページを10回ロードすることができます(何度も繰り返し)。私はfirebase functionsbetaにあることを知っています。これは彼らの側のバグでしょうか?ここに私のfirebase functionsコードです:

exports.sortDistance = functions.https.onRequest((req, res) => { 
    // Grab the text parameter. 
    var array = req.query.text.split(':'); 
    // Push the new message into the Realtime Database using the Firebase Admin SDK. 
    // Get a database reference to our posts 
    var db = admin.database(); 
    var ref = db.ref("profiles/stylists"); 
    var promises = []; 
    // Attach an asynchronous callback to read the data at our posts reference 
    ref.on("value", function(snapshot) { 
     //console.log(snapshot.val()); 
     var snap = snapshot.val(); 
     for(const user in snap) { 
     promises.push(new Promise(function(resolve, reject) { 
      var snapadd = snap[user].address; 
      console.log(snapadd + " snap user address (((((((())))))))"); 
      if(snapadd != null || typeof snapadd != undefined) { 
        googleMapsClient.geocode({ 
         address: snapadd 
        }).asPromise() 
         .then(response => { 
          console.log(response.json.results[0].geometry.location.lat); 


          console.log(" +++ " + response.json.results[0].geometry.location.lat + ' ' + response.json.results[0].geometry.location.lng + ' ' + array[0] + ' ' + array[1]); 


          var distanceBetween = distance(response.json.results[0].geometry.location.lat, response.json.results[0].geometry.location.lng, array[0], array[1]); 
          console.log(distanceBetween + "  distance between spots"); 
          var refList = db.ref("distances/"+array[2]); 
          console.log(snap[user].username + " snap username"); 
          refList.push({ 
          username: snap[user].username, 
          distance: Math.round(distanceBetween * 100)/100 
          }) 

          resolve(); 
         }) 
         .catch(err => { console.log(err); resolve();}) 
      } 
      else { 
       resolve(); 
      } 
     }).catch(err => console.log('error from catch ' + err))); 
     //console.log(typeof user + 'type of'); 

     } 

     var p = Promise.all(promises); 
     console.log(JSON.stringify(p) +  "  promises logged"); 

     res.status(200).end(); 

    }, function (errorObject) { 
     console.log("The read failed: " + errorObject.code); 
    }); 
}); 

何奇妙なことは、私はfirebase functionsログをチェックすると、このすべてが一度だけ実行するように見える...しかし、私はまだサブスクリプションは全体のソート処理中に取り込むことができると思い、あります何か奇妙な方法で急速にそれを返す。私が考えていることでできるだけ明確になるように、私は、並べ替えの各段階が(N(N + 1))/2に取り込まれていると思います... 1から始めておよそ30になる...そしてソートの合計は私のリストの長さ(1から10までのアイテムが何度も繰り返されています)。

+0

をこの問題(https://stackoverflow.com/q/47561946/4815718)で問題を解決できなかった場合は、ここでも 'on()'の代わりに 'once()'を使うべきです: 'ref.on ( "値"、機能(スナップショット) '。 –

+0

私はそれを試しました...それは何も実行されていないように見えました...病気をもう一度試してみてください...そしてfirebase関数のログを再チェックして、私のアプリに表示されるだけではない – ewizard

+0

非同期操作の数が大きくなると、それはCloudModule'SortDistance'にあるように、すべてのPromiseを正しく連結することは困難です。あなたが試したように見えますが、いくつか見落とされています。例えば 'refList.push(...)'です。 –

答えて

0

私はangularfire2 5.0angular 5.0に更新します...少し時間がかかりましたが、問題を解決してしまった:

this.distanceList = this.af.list('/distances/' + this.username, 
    ref => ref.orderByChild("distance").limitToFirst(50)).valueChanges(); 

HTMLでは、私は、ソートの問題を解決しasyncパイプ、使用:あなたはの[前のインスタンスに表示が

... 

<ion-item *ngFor="let z of (distanceList|async)" no-padding> 

... 
関連する問題