订阅中的代码在应该只执行一次时重复执行

时间:2017-11-29 21:15:21

标签: javascript typescript firebase ionic-framework firebase-realtime-database

更新

实际上,它会被订阅(根据日志)。它会被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代码中?

0 个答案:

没有答案