如何在函数外部调用customerId?Firebase Auth技术问询
如何在函数外部访问
customerId? 我明白你现在的困扰:你的customerId是定义在嵌套的异步回调函数里的,不仅作用域被限制在回调内部,而且因为异步操作的特性,直接在外部根本拿不到已经赋值好的customerId。下面我给你详细的解决方案和思路:
问题根源
你当前的代码里,customerId是在firebase.database().ref(...).once('value')的回调函数里定义的,这个回调是异步执行的——也就是说,当你试图在外部代码里访问这个变量时,可能这个回调还没执行,变量根本没被赋值;而且就算执行了,变量的作用域也仅限于那个回调函数内部,外部根本访问不到。
解决方案:用Promise封装异步逻辑
我们可以把获取customerId的整个流程封装成一个返回Promise的函数,这样外部就能通过异步的方式等待操作完成并拿到结果。
首先,封装获取逻辑:
function getCustomerId() { return new Promise((resolve, reject) => { firebase.auth().onAuthStateChanged(user => { if (user) { // 直接用回调里的user对象获取uid,不用重复调用currentUser const userId = user.uid; firebase.database() .ref(`stripe_customers/${userId}/customer_id`) .once('value') .then(snapshot => { if (snapshot.exists()) { // 获取到customerId后,把它传递给外部 resolve(snapshot.val()); } else { reject(new Error("找不到对应的customer_id")); } }) .catch(err => { reject(err); }); } else { reject(new Error("当前没有用户登录")); } }); }); }
然后,在函数外部调用这个函数来获取customerId:
方式1:使用.then()链式调用
getCustomerId() .then(customerId => { console.log("外部获取到的Customer ID:", customerId); // 在这里可以使用customerId执行你需要的逻辑 }) .catch(error => { console.error("获取customerId失败:", error); });
方式2:使用async/await(更简洁)
如果你在一个async函数里,可以用await来等待结果:
async function handleCustomerId() { try { const customerId = await getCustomerId(); console.log("外部获取到的Customer ID:", customerId); // 在这里处理customerId相关逻辑 } catch (error) { console.error("获取失败:", error); } } // 调用这个async函数 handleCustomerId();
额外优化小提示
- 不用重复调用
firebase.auth().currentUser.uid,onAuthStateChanged的回调参数已经给到你当前登录的user对象,直接用user.uid就可以啦,更高效。 - 注意错误处理:不管是用户未登录,还是数据库读取失败,或者找不到
customer_id,都要通过reject抛出错误,这样外部就能统一处理这些异常情况。
内容的提问来源于stack exchange,提问作者Bryan Sanders
相关产品推荐
相关产品推荐

