2016-04-24 119 views
1

我已經創建了下面的服務。如何在AngularFire中返回異步函數結果

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

      userProfile: function() { 
       var FBref = new Firebase(FBDB).child('items'); 
       FBref.orderByChild('first') 
        .startAt(searchParam) 
        .endAt(searchParam) 
        .once('value', function (snapshot) { 
        var data = snapshot.val(); 

         personalKey = Object.keys(data)[0]; 

         return(personalKey);  
       }); 

       return(personalKey); 

      } 
     }; 
    }]); 

但是,當我試圖讓personalKey在下面的控制值的結果,我得到 「未定義」:

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

console.log(userProfileFactory.userProfile()) 

}]); 

請指點:)

回答

3

是的,你可以在您希望通過從$q

userProfile: function() { 
    var deferred = $q.defer(); 
    var FBref = new Firebase(FBDB).child('items'); 
    var promise = FBref.orderByChild('first') 
    .startAt(searchParam) 
    .endAt(searchParam) 
    .on('value', function(snapshot) { 
    var data = snapshot.val(); 
    personalKey = Object.keys(data)[0]; 
    deferred.resolve(personalKey); 
    }); 
    return deferred.promise 
} 
userProfile: function() { 
    var deferred = $q.defer(); 
    var FBref = new Firebase(FBDB).child('items'); 
    var promise = FBref.orderByChild('first') 
    .startAt(searchParam) 
    .endAt(searchParam) 
    .on('value', function(snapshot) { 
    var data = snapshot.val(); 
    personalKey = Object.keys(data)[0]; 
    deferred.resolve(personalKey); 
    }); 
    return deferred.promise 
} 
獲得數據的異步方式創建自定義承諾

然後控制器會用.then函數調用工廠函數來鏈接promise。

app.controller('profileCtrl', ['userProfileFactory', function(userProfileFactory) { 
    userProfileFactory.userProfile().then(function(res){ 
     console.log(res); 
    }) 
}]); 
+0

完美地工作。非常感謝:) –

+0

@JohnCarson很高興幫助你。謝謝:-) –

+0

@PankajParkar謝謝。我正在尋找相同的。 –