5

द्वारा अपडेट किया जा रहा है, मुझे लगता है कि firebase database में एक सूची अपडेट करने के लिए subscription पर कब्जा कर लिया जा रहा है जो उस सूची में सदस्यता लेता है। सूची आउटपुट मेरे फोन (ऐप में) जैसा दिखता है ... और जो मेरा कंसोल आउटपुट दिखता है (जिस तरह से यह दोहराता है) ऐसा लगता है कि यह पूरी सूची को कैप्चर कर रहा है और इसे प्रत्येक बार जोड़े जाने पर प्रदर्शित करता है। तो (मैं इस ऊपर देखा) ... मेरा मानना ​​है कि इस समीकरण का प्रतिनिधित्व करता है क्या हो रहा है:फ़ायरबेस फ़ंक्शन निष्पादन और उस सूची में सदस्यता जिसे फ़ायरबेस फ़ंक्शन

(N(N + 1))/2

यह है कि कैसे आप में गणित कर एन 1 से संख्या के सभी का योग प्राप्त मेरी मामला (एन = 30 या तो), मुझे लगभग 465 प्रविष्टियां मिलती हैं ... ताकि आप देख सकें कि यह एक टन लोड हो रहा है, जब मैं केवल इसे पहले लोड करना चाहता हूं 10.

आउटपुट के साथ क्या हो रहा है यह दिखाने के लिए यहां पेस्टबिन https://pastebin.com/B7yitqvD है।

आउटपुट में length - 1 load से ऊपर/उससे पहले की सरणी पर ध्यान देना। आप देख सकते हैं कि यह हर बार एक और प्रविष्टि के साथ एक सरणी लौट रहा है और इसे सूची में जोड़ रहा है। मैंने अपनी सूची में कितनी चीजें हैं, इसकी एक बहुत ही ग़लत गिनती की, और मुझे 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(); 
     }) 

    } 

loadDistances में subscription समारोह ठीक जब तक मैं दूसरे पृष्ठ से सूची को अद्यतन नहीं करते के रूप में काम करता है - एक और संकेत है कि यह पूरी तरह कब्जा हो सकता है और बार-बार यह लिस्टिंग के रूप में यह क्रमबद्ध करता है।

मैंने कोशिश की है कि मैं अपडेट के बाद सूची से 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) कि उसने समस्या का समाधान नहीं किया है, आपको अभी भी '()' के बजाय 'एक बार()' का उपयोग करना चाहिए: 'ref.on ("मूल्य", समारोह (स्नैपशॉट) '। –

+0

मैं करने की कोशिश की है कि ... और यह यह लगता कुछ भी नहीं चलाता है की तरह बनाया ... बीमार इसे फिर से कोशिश ... और पुनः जाँच firebase समारोह लॉग अगर कुछ भी निष्पादित हो जाता है देखने के लिए और मैं ts बस अपना एप्लिकेशन – ewizard

+0

में नहीं दिख रहा asynch संचालन की संख्या बड़े हो जाता है, के रूप में यह बादल समारोह 'sortDistance' में है, यह सब वादे सही ढंग से श्रृंखला मुश्किल है। ऐसा लगता है कि आपने कोशिश की है, लेकिन कुछ मिस्ड हैं, उदाहरण के लिए यहां: 'refList.push (...) '। –

उत्तर

0

मैंने angularfire2 5.0 और angular 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> 

... 
संबंधित मुद्दे