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.
- 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).
: Ben sıralama problemini ortadan
async
boru, kullanılan benimHTML
yılındaBu 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) '. –
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
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 (...)'. –