5

Tôi nghĩ rằng việc cập nhật danh sách firebase database đang bị giữ bởi một subscription đã được đăng ký vào danh sách đó. Từ đầu ra danh sách trông như thế nào trên điện thoại của tôi (trong ứng dụng) ... và từ giao diện điều khiển của tôi trông như thế nào (cách nó lặp lại) có vẻ như nó đang chụp toàn bộ danh sách và hiển thị nó mỗi lần thêm vào. Vì vậy, (tôi nhìn này lên) ... Tôi tin rằng phương trình này đại diện cho những gì đang xảy ra:Thực thi chức năng Firebase và đăng ký danh sách đang được cập nhật bởi chức năng firebase

(N(N + 1))/2

Đó là cách bạn có được tổng của tất cả các số từ 1 đến N. Làm toán trong tôi trường hợp (N = 30 hoặc hơn), tôi nhận được khoảng 465 mục ... vì vậy bạn có thể thấy nó đang tải một tấn, khi tôi chỉ muốn tải nó lần đầu tiên 10.

Để hiển thị những gì đang xảy ra với đầu ra đây là một pastebin https://pastebin.com/B7yitqvD.

Trong đầu ra, hãy chú ý đến mảng phía trên/trước length - 1 load. Bạn có thể thấy rằng nó nhanh chóng trả về một mảng với một mục nhập khác mỗi lần và thêm nó vào danh sách. Tôi cũng đã đếm được rất nhiều mục trong danh sách của mình, và tôi nhận được 440 ... vì vậy nó gần giống với số 465.

Các chuỗi sự kiện bắt đầu trong một trang mà không phải là trang với danh sách với chức năng này - mà khởi sắp xếp trên firebase functions phụ:

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

Dưới đây là các chức năng trên trang với list mà tôi nghĩ là chụp toàn bộ loại vì một lý do nào đó. Các thuê bao đang được lặp lại như các loại firebase function, tôi tin.

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

    } 

Các subscription trong loadDistances chức năng hoạt động tốt miễn là tôi không cập nhật danh sách từ trang khác - một chỉ báo rằng nó có thể chụp toàn bộ sắp xếp và liệt kê nó lặp đi lặp lại như nó loại.

Tôi đã thử như tôi có thể nghĩ đến unsubscribe từ danh sách sau khi tôi cập nhật ... vì vậy sau đó tôi có thể tải danh sách 10 lần sau khi trang có danh sách nhập, thay vì ngay sau khi cập nhật (lặp đi lặp lại). Tôi biết rằng firebase functions nằm trong số beta. Đây có phải là một lỗi trên mặt của họ? Đây là mã của tôi 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); 
    }); 
}); 

gì là kỳ lạ là, khi tôi kiểm tra firebase functions bản ghi, tất cả điều này dường như chỉ chạy một lần ... nhưng tôi vẫn nghĩ rằng các thuê bao có thể nắm bắt được quá trình phân loại toàn bộ trong một số cách kỳ lạ trong khi nhanh chóng trả lại nó. Để rõ ràng nhất có thể với những gì tôi nghĩ đang diễn ra - tôi nghĩ rằng mỗi giai đoạn của sắp xếp sẽ bị bắt trong một số (N(N + 1))/2 ... bắt đầu từ 1 và lên tới khoảng 30 ... và tổng số sắp xếp kết thúc lên độ dài của danh sách của tôi (với 1-10 mục lặp đi lặp lại nhiều lần).

+0

Mặc dù bạn ghi trên [Ví dụ trước đây của câu hỏi này] (https://stackoverflow.com/q/47561946/4815718) rằng nó không giải quyết được vấn đề, bạn vẫn nên sử dụng 'once()' thay vì 'on()' ở đây: 'ref.on ("giá trị", function (ảnh chụp) '. –

+0

tôi đã cố gắng mà ... và nó đã làm cho nó có vẻ như không có gì chạy ... ốm thử nó một lần nữa ... và kiểm tra lại các bản ghi chức năng căn cứ hỏa lực để xem nếu bất cứ điều gì được thực hiện và tôi ts không chỉ hiển thị trong ứng dụng của tôi – ewizard

+0

Khi số lượng các hoạt động asynch trở nên lớn, vì nó là trong Cloud Function 'sortDistance', thật khó để chuỗi tất cả các lời hứa một cách chính xác. Có vẻ như bạn đã thử, nhưng một số bị bỏ qua, ví dụ ở đây: 'refList.push (...)'. –

Trả lời

0

Tôi đã cập nhật thành angularfire2 5.0angular 5.0 ...mà mất một chút thời gian, nhưng cuối cùng lại giải quyết vấn đề:

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

Trong tôi HTML Tôi đã sử dụng một ống async, mà giải quyết vấn đề sắp xếp:

... 

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

... 
Các vấn đề liên quan