Promise履行成功返回undefined 如何获取Firestore查询返回的文档ID值
问题原因
出现该问题是两个错误共同导致的:
- 异步执行顺序问题:
docId本身是 Promise 实例,不是异步请求返回的结果。JavaScript 会优先执行所有同步代码,你写在最外层的console.log(docId)执行时,Firebase 的异步请求还没有完成,自然拿不到返回值。 - 返回值作用域错误:你写的
return doc.id是在forEach的回调函数内部,这个返回值只会终止当前次的遍历,根本不会传递到外层的then回调中,导致整个 Promise 链没有有效返回值。
解决方案
方案1:使用 async/await 语法(推荐)
这是最易读的异步处理方式,所有依赖异步结果的逻辑都需要放在 await 关键字之后执行:
// 将异步逻辑包在 async 函数中 async function fetchPaymentDocId() { const querySnapshot = await firebase .firestore() .collection('users') .doc(user.uid) .collection('payments') .get(); // 取第一个文档的id,如果需要所有文档id可以改用map: // const docIds = querySnapshot.docs.map(doc => doc.id) const docId = querySnapshot.docs[0]?.id; // 此处可以正常使用docId console.log('拿到的文档id:', docId); return docId; } // 外部调用时也需要用await或者then接收结果 fetchPaymentDocId().then(docId => { // 这里也可以使用拿到的docId console.log('外部获取的文档id:', docId); });
方案2:使用 Promise 链式调用
如果不想用 async/await 语法,也可以把所有依赖异步结果的逻辑都放在 then 回调链中:
firebase .firestore() .collection('users') .doc(user.uid) .collection('payments') .get() .then(querySnapshot => { const docId = querySnapshot.docs[0]?.id; // 此处可以直接使用docId console.log(docId); // 将结果往下传递,后续then也能拿到 return docId; }) .then(docId => { // 此处可以继续使用docId写业务逻辑 });
注意事项
只要是异步返回的结果,永远不能在同步代码中直接获取,必须等待异步操作完成后,在 then 回调或者 await 之后的代码中才能使用。
内容的提问来源于stack exchange,提问作者Hesam Alavi
相关产品推荐
相关产品推荐

