更新
实际上,它会被订阅(根据日志)。它会被loadDistances
和滚动的一个捕获......取决于滚动是否启动了查找,或者它是否只是加载。
更新
在更仔细地查看控制台输出后,我意识到问题不在于我的loadDistances
功能 - 当你向下滚动并加载新项目时会运行代码...它是自动运行。作为无法在一个页面上使用ion-infinite-scroll
的解决方法,我使用此代码:
let element = this.elRef.nativeElement.querySelector('.scroll-content');
element.addEventListener('scroll', (event) =>
{
var element = event.target;
if (element.scrollHeight - element.scrollTop === element.clientHeight)
{
if(this.distancey.nativeElement.style.display != 'none') {
this.doInfiniteD();
}
...
在我使用"设置位置"后,这段代码一遍又一遍地重复。设置用户的位置,然后向后滑动到显示距离列表的根页面。除了这种情况,滚动代码永远不会像这样重复。
我有这个代码加载已经按firebase functions
代码排序的数据库的距离(如下所示):
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
}});
let x = 0;
this.subscription6 = this.distancelist.subscribe(items => {
console.log(JSON.stringify(items) + " length - 1 load");
console.log("BEGGINNING STARTATKEY4 WITH DISTANCE: " + this.startAtKey4);
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++;
})
})
}
当我的应用加载一切按预期工作时,订阅中的代码会发生一次,并根据他们与用户的距离加载前10个。问题是,我有一个"设置位置"另一个页面上的按钮,执行下面的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); reject(err);})
}
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");
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
});
我相当确定这里的一切都井然有序。它根据用户的距离对用户进行排序,并在数据库中创建一个我可以看到的列表......它只有30个左右的条目(数据库中只有30个左右的用户)。然而,在点击"设置位置"按钮并使用loadDistances
(根页面)导航回页面...它需要几秒钟才能回到它...然后它会以看似随机的顺序加载数百个条目,只是重复我在数据库的列表中所拥有的,并且它也是按顺序加载它们...没有排序(不是我想要额外的条目加载)。
我可以在控制台输出中看到loadDistances()
使用"设置位置"后正在反复运行订阅代码。 loadDistances()
的控制台输出位于https://pastebin.com/zMZcj9wa。
为什么我的代码会在订阅中重复出现?在"设置位置"是否与订阅有关。排序发生在firebase functions
代码中?