質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

2246閲覧

javascriptで非同期処理した値を返す関数を作りたい

maltz

総合スコア8

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/10/29 10:05

###前提・実現したいこと

非同期処理で手に入る値を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*/

今までは、コールバック関数の中に処理を続けて書いていたのですが、インデントの数が多くなってきたため他に書き方はないかと思ったので質問させて頂きました。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naomi3

2016/10/29 23:57

onAuthStateChangedは状態が変化したら関数を必ずコールするんですよね?どのような状態か調べなくてよいのでしょうか?userがtrueと等価ならばfirebase.auth().currentUserが絶対undefinedにならないと解釈してよいのでしょうか?関数が2回以上コールされている可能性はありませんか?user_info = user_info || firebase.auth().currentUser;でどうでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問