2016-04-29 4 views
0

以下のサービスを作成しました。AngularFireで非同期関数の結果を返してファイアベースに保存する方法

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)関数の中に戻す必要があります。