###前提・実現したいこと
非同期処理で手に入る値をreturnする関数を作りたいです。
具体的にはfirebaseでログインしているユーザーの情報を返す関数です。
###試したこと
以下が初めに書いたコードです
var auth = function () { var user_info; firebase.auth().onAuthStateChanged(function (user) { if (user) { user_info = firebase.auth().currentUser; console.log(user_info)//ここでは取れる。 } else { console.log('// No user is signed in.'); } }); console.log(user_info);//ここでは取れない. return user_info; //undifinedが変える。 }; var current_user = auth(); console.log(current_user);//undifinedになる
そしてプロミスを利用したコードです。
javascript
1var auth = function () { 2 new Promise(function (resolve, reject) { 3 firebase.auth().onAuthStateChanged(function (user) { 4 if (user) { 5 var user_info = firebase.auth().currentUser; 6 console.log(user_info);//ここでは取れる 7 resolve(return_function(user_info)); 8 } else { 9 console.log('// No user is signed in.'); 10 reject({ 11 message: 'APIにアクセスできませんでした' 12 }); 13 } 14 }); 15 }); 16 var return_function = function (arg) { 17 return arg; 18 }; 19 return return_function; 20 }; 21 22console.log(auth()); 23/* function (arg) { 24 return arg; 25 } 26がログに出る 27*/
今までは、コールバック関数の中に処理を続けて書いていたのですが、インデントの数が多くなってきたため他に書き方はないかと思ったので質問させて頂きました。
よろしくお願いします。
onAuthStateChangedは状態が変化したら関数を必ずコールするんですよね?どのような状態か調べなくてよいのでしょうか?userがtrueと等価ならばfirebase.auth().currentUserが絶対undefinedにならないと解釈してよいのでしょうか?関数が2回以上コールされている可能性はありませんか?user_info = user_info || firebase.auth().currentUser;でどうでしょうか?
あなたの回答
tips
プレビュー