2016-04-29 89 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)函数中。