5

Ben firebase database listesinde bulunan bir listeyi güncelleştiren bir subscription bu listede abone olan bir güncelleştirme güncelleştiriliyor. Telefonumda (uygulamada) liste çıktısının nasıl göründüğünden ... ve konsol çıktımın neye benzediğinden (tekrarladığı gibi), tüm listeyi yakalayıp her eklendiğinde görüntüleniyor gibi görünüyor. Yani ... Bu denklem neler olduğunu gösterdiğine inanıyoruz (Ben bu baktım alanı): matematik yapmak N. 1'den sayıların toplamını almak nasılFirebase işlev yürütme ve bir firebase işlevi tarafından güncelleştirilmekte olan liste için abonelik

(N(N + 1))/2

Öyle benim durumda (N = 30 ya da öylesine), ben yaklaşık 465 girişler olsun ... bu yüzden sadece ilk 10 yüklemek istediğiniz zaman, bir ton yükleme görebilirsiniz görebilirsiniz.

Çıktı ile neler olduğunu göstermek için Burada bir macun https://pastebin.com/B7yitqvD. Çıkışta length - 1 load'dan önce/üstünde olan diziye dikkat edin. Her seferinde bir giriş daha içeren bir diziyi hızla döndürdüğünü ve listeye eklediğini görebilirsiniz. Listemde kaç tane öğe olduğunu çok kaba bir şekilde saydım ve 440 aldım ... böylece kabaca 465 sayısına denk geliyor.

olaylar zincirinin bu işlevle listeyle sayfa olmayan bir sayfaya başlar

- firebase functions tarafta sıralama başlatır: Burada

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(); 
}) 

Sayfadaki fonksiyonudur list, sanırım bir sebepten dolayı bu tür bir şeyi ele geçiriyor. Abonelik firebase function tür olarak tekrar ediliyor, inanıyorum.

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(); 
     }) 

    } 

subscription fonksiyon loadDistances ince sürece diğer sayfadan listesini güncellemek yok gibi çalışır - bu bütün çeşit yakalama ve sıralar olarak tekrar tekrar listeleme olabileceğini başka göstergesi.

Güncelleştirdikten sonra listeden unsubscribe'u düşünebildiğim kadar denedim ... bu yüzden, sonraki 10 sayfanın listeden sonraki tam yerine, listenin girilmesinden hemen sonra girebilirim (tekrar tekrar). firebase functions'un beta adresinde olduğunu biliyorum. Bu onların tarafında bir böcek olabilir mi? İşte benim firebase functions kodu:

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); 
    }); 
}); 

Ne garip ben firebase functions günlüklerini kontrol zaman, bütün bunlar sadece bir kez çalıştırmak için görünür ... ama yine abonelik bütün sıralama işlemini de yakalama olabileceğini düşünüyorum, olduğunu hızlı bir şekilde geri döndürürken garip bir şekilde. Düşündüğüm şeyle olabildiğince açık olmak gerekirse - sanırım her bir aşama bir (N(N + 1))/2'da ... 1'den başlayıp 30'a yaklaşıyor ... ve sıralamaların toplamı bitiyor. Listemin uzunluğu (1-10 öğe tekrar tekrar tekrar ile).

+0

: Ben sıralama problemini ortadan async boru, kullanılan benim HTML yılında

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

Bu soru] (https://stackoverflow.com/q/47561946/4815718) sorunu çözmediğini, yine de 'on() 'burada:' ref.on yerine 'once()' yi kullanmalısınız ("value", işlev (snapshot) '. –

+0

bunu denedim ... ve hiçbir şey işe yaramıyor gibi görünüyordu ... tekrar deneyin ... ve bir şey idam edilip edilmediğini görmek için firebase işlev kayıtlarını yeniden kontrol edin. Yalnızca benim uygulamamda görünmüyor – ewizard

+0

Asynch işlemlerinin sayısı, Cloud Function 'sortDistance' içinde olduğu gibi büyüdüğünde, tüm Promises'ları doğru bir şekilde zincirlemek zordur. Denediniz gibi görünüyor, ama bazıları kaçırılıyor, örneğin burada: 'refList.push (...)'. –

cevap

0

angularfire2 5.0 ve angular 5.0 güncelleştirildi ...hangi biraz zaman aldı, ama sorunu çözmeye sona: Eğer [önceki örneğinde belirtmesine rağmen

... 

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

...