如何从异步函数中获取变量?Firestore变量外部未定义问题
解决Firestore异步操作外部获取变量值的问题
你的代码中出现问题的核心原因是:db.collection("LM35").get()是异步操作,代码执行顺序是先运行外部的console.log(LM35TOTALRES),此时then里的回调函数还没执行,变量还未被赋值,所以显示undefined。
以下是几种可行的解决方案:
方案一:使用async/await(推荐,代码更简洁)
将逻辑包裹在异步函数中,通过await等待Firestore请求完成后再获取值:
async function getLM35Total() { const querySnapshot = await db.collection("LM35").get(); const LM35TOTALRES = querySnapshot.size; // 在这里或后续调用中使用变量 console.log(LM35TOTALRES); return LM35TOTALRES; } // 外部调用获取值 getLM35Total().then(count => { console.log(count); // 成功获取异步返回的数量 });
方案二:将业务逻辑放在then回调内
把所有需要用到LM35TOTALRES的代码都放到then的回调函数里,确保数据返回后再执行:
db.collection("LM35").get().then(function(querySnapshot) { const LM35TOTALRES = querySnapshot.size; console.log(LM35TOTALRES); // 正常输出 // 在这里执行所有依赖该变量的逻辑 processCount(LM35TOTALRES); }); // 封装需要使用变量的逻辑为函数 function processCount(count) { console.log(count); // 通过参数获取异步返回的值 }
方案三:用Promise封装请求
将Firestore的请求封装成Promise,方便后续在任意地方调用获取值:
function fetchLM35Count() { return db.collection("LM35").get().then(querySnapshot => { return querySnapshot.size; }); } // 外部调用 fetchLM35Count().then(count => { console.log(count); // 成功获取数量 });
总结:异步操作不会阻塞代码执行,必须等待异步任务完成(通过then回调或await)后,才能访问其返回的数据,无法在异步操作外同步直接获取未赋值的变量。
内容的提问来源于stack exchange,提问作者Ralph Bibat
相关产品推荐
相关产品推荐

