繁体   English   中英

如何在Firebase身份验证和Firebase中使用Javascript Promise链接?

[英]How do I use Javascript Promise Chaining with Firebase Authentication and Firebase?

我需要使用用户的Firebase用户ID利用存储在Firebase中的密钥。

我的功能步骤如下:

1)验证后获取Firebase用户ID

2)使用Firebase用户ID,拉出存储的API密钥值(我保存在节点中:app / {Firebase用户ID})

3)使用存储的API密钥值,运行我的最后一个函数

经过研究后,我得出的结论是我应该对下面的代码使用Javascript Promise Chaining,这让我很困难

firebase.initializeApp({databaseURL: "{}"});
var dbRef = firebase.database();

function pull_api_key_from_firebase_after_auth(func){
  firebase.auth().onAuthStateChanged((user) => {
  if (user) {
     var app_ref = dbRef.ref('app').child(user.uid);
     app_ref.on("child_added", function(snap) {
        dictionary_object = snap.val()
        api_key = dictionary_object.api_key
        func(api_key)
      })
    }
  });
}

function final_function(api_key){
   console.log('processing final function')
}

pull_api_key_from_firebase_after_auth(final_function)

另外,我想像这样使api_key成为全局变量:

function pull_api_key_from_firebase_after_auth(func){
      firebase.auth().onAuthStateChanged((user) => {
      if (user) {
         var app_ref = dbRef.ref('app').child(user.uid);
         app_ref.on("child_added", function(snap) {
            dictionary_object = snap.val()
            api_key = dictionary_object.api_key
            localStorage.setItem('api_key',api_key)

          })
        }
      });
    }

api_key = localStorage.getItem('api_key')
final_function(api_key)

但是我无法弄清楚如何使final_function以及其他函数等到定义了api_key

必须使用firebase.auth().onAuthStateChanged来获取.auth.currentUser.uid在页面加载时将不可用。 它显示一微秒后(它是异步的)。

做你想简单地打造出一个承诺函数中调用它.onAuthStateChanged.then做你的其他功能。 您的自定义承诺可能如下所示:

function fetchUserData(){
    return new Promise(function(resolve, reject){
        var db = firebase.firestore(); // OR realtime db
        db.collection("users").get().then(function(snap) {
            resolve (snap);
        }).catch(function(error) {
            reject (error);
        });
    }); 
}

.onAuthStateChange只需执行以下操作:

fetchUserData().then((snap) => {
    // do your thing

})
.catch((error) => {
    console.log(error);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM