2016-04-29 94 views
0

我已經創建了下面的服務。如何將異步函數結果返回並保存到AngularFire的firebase中

app.factory('userProfileFactory', ['FBDB', 'searchParam', function(FBDB, searchParam) { 
     var personalKey; 
    return { 

     userProfile: function(searchEmail) { 
      var deferred = $q.defer(); 
      var FBref = new Firebase(FBDB).child('items'); 
      var promise = FBref.orderByChild('email') 
       .startAt(searchEmail) 
       .endAt(searchEmail) 
       .on('value', function(snapshot) { 
        var data = snapshot.val(); 
        personalKey = Object.keys(data)[0]; 
        deferred.resolve(personalKey); 
       }); 
      return deferred.promise; 
     } 
    }; 
}]); 

我的控制器如下。問題是需要一段時間才能返回結果。因此,當$ save函數在工廠函數外被調用時,它會報告一個'未定義的變量'。如何在$ save以外的地方使用它?

app.controller('profileCtrl', ['userProfileFactory', 'FBDB', '$firebaseArray', function(userProfileFactory, FBDB, $firebaseArray) { 

var FBref = new Firebase(FBDB).child('items'); 

    userProfileFactory.userProfile().then(function(res){ 
     var personalKey = res; 

     item.personalKey = res; 

     //$firebaseArray(FBref)$save(item); It works here. But moved this from here... 
    }) 

    $firebaseArray(FBref)$save(item); //...to here. It does not work. 

}]); 

回答

0

在你的代碼中,行:

$firebaseArray(FBref)$save(item); 

將決心功能之前執行:

function(res){ 
    var personalKey = res; 

    item.personalKey = res; 
} 

的決心功能等待userProfileFactory.userProfile()承諾解決(數據將被返回),而firebase.save行則不會。你需要把它放回到then(resolve)函數中。