2016-08-09 42 views
0

我想將數據發送到Firebase數據庫,並等待數據更新後再執行其他操作,例如$ state.go或其他操作。
Firebase等到值更新

如何以Firebase和AngularJs的良好方式做到這一點?

這是我的部分代碼:

var ref_achats_offres = firebase.database().ref('achats_offres'); 
    var key_achats_offres = ref_achats_offres.push().key; 
    var ladate = moment().format(); 
    var accountId = $localStorage.accountId; 
    var push_achats_offres = ref_achats_offres.child(key_achats_offres).set({ 
       cout: cout, 
       ajout_le: ladate, 
       active:true, 
       accounts: accountId, 
       id_offre : id_offre, 
       unique_code: code 
      }); 

var ref_offres = firebase.database().ref('offres'); 
ref_offres.child(id_offre).child('achats_offres').child(key_achats_offres).set(true); 
var ref_accounts = firebase.database().ref('accounts'); 
ref_accounts.child(accountId).child('achats_offres').child(key_achats_offres).set(true); 
      firebase.database().ref('accounts').child(accountId).child('credits').transaction(function(credits) { 
      return credits - cout; 
      }); 

      $scope.modal2.hide(); 
      Utils.message(Popup.checkIcon, Popup.achatOffreEffectue); 
      $state.go('mes_achats'); 
+0

我什麼都不知道關於Angular。然而,你在尋找的是一個firebase「交易」:https://firebase.google.com/docs/database/web/save-data#save_data_as_transactions 交易回調的方式被稱爲有點抱怨,但啓用一個非常靈活的用法,您應該閱讀詳細信息:https://firebase.google.com/docs/reference/js/firebase.database.Reference#transaction – Sistr

+0

另請參閱AngularFire關於路由最佳實踐的建議(即使用'resolve ')[這裏](https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md#authenticating-with-routers)。 – Kato

+0

@Kato我不明白你在說什麼!我的路線有問題嗎?謝謝 ! –

回答

0

set()transaction()調用返回的承諾。當寫入操作完成時,承諾解決,您可以通過執行then()來處理此問題。

如果你希望兩個組操作按順序運行,然後瀏覽:

ref_accounts.child(accountId).child('achats_offres').child(key_achats_offres) 
    .set(true) 
    .then(function() { 
     firebase.database().ref('accounts').child(accountId).child('credits') 
      .transaction(function(credits) { 
       return credits - cout; 
      }) 
      .then(function() { 
       $scope.modal2.hide(); 
       Utils.message(Popup.checkIcon, Popup.achatOffreEffectue); 
       $state.go('mes_achats'); 
      }); 
    }); 

如果你希望它們並行運行並且都在你面前完成導航:

var setPromise = ref_accounts.child(accountId).child('achats_offres').child(key_achats_offres).set(true); 
var transactionPromise = firebase.database().ref('accounts').child(accountId).child('credits') 
      .transaction(function(credits) { 
       return credits - cout; 
      }); 
Promise.all([setPromise, transactionPromise]). 
     .then(function() { 
      $scope.modal2.hide(); 
      Utils.message(Popup.checkIcon, Popup.achatOffreEffectue); 
      $state.go('mes_achats'); 
     }); 
+0

謝謝!第二種方式正是我所期待的。這是一個完美的方式來做我的預期。再次感謝你。 –