为何foreach填充的常量变量在Firestorm异步操作外值为空?
问题原因分析
这是JavaScript异步操作的执行顺序导致的问题,核心逻辑拆解如下:
- 代码执行时,先同步创建
const customers = {},随后调用customersRef.get()——这是Firestore发起的异步网络请求,会在后台单独处理,不会阻塞主线程代码。 - 主线程不会等待异步请求完成,会直接执行后续的外部
console.log(customers),此时异步请求还在处理中,customers还没被赋值,所以输出空对象。 - 只有当Firestore的异步请求完成、拿到数据后,才会触发
.then里的回调函数,这时才会通过forEach给customers填充数据,随后执行回调内的console.log(customers),自然能输出完整的对象。
简言之:外部的console.log在异步回调执行前就已经运行了,所以看不到填充后的数据。
如果需要在回调外部使用填充后的customers,可以用两种方式处理:
- 把所有依赖
customers的逻辑直接放到.then回调内部执行 - 用
async/await语法改写,让异步逻辑更接近同步写法:const customers = {}; async function getCustomers() { try { const snapshot = await customersRef.get(); snapshot.docs.forEach((doc) => { customers[doc.id] = doc.data(); }); console.log(customers); // 此处能拿到完整数据 // 后续使用customers的逻辑都可以写在这里 } catch (e) { console.log(e.message); } } getCustomers();
内容的提问来源于stack exchange,提问作者Anton Norman
相关产品推荐
相关产品推荐

