如何消除Promise,让JavaScript异步函数直接返回普通数据对象?
问题解决:async方法返回Pending Promise的问题
错误原因
你的代码存在两个核心问题:
- 未等待异步操作完成:
this.collection.doc(search).get()是异步方法,返回Promise,直接赋值给doc会得到处于pending状态的Promise对象,而非实际的文档数据。 - 变量名拼写错误:代码中写了
return get.data(),但实际应该调用已赋值的doc变量的data()方法,即return doc.data()。
修正后的代码
第一步:修复findOne方法
class db{ async findOne(search){ try { // 用await等待异步get()操作完成,拿到文档快照 const doc = await this.collection.doc(search).get(); // 获取文档的实际数据 return doc.data(); } catch (error) { console.error(error.message); process.exit(1); } } }
第二步:正确调用方法(需在async环境中使用await)
async方法的返回值始终是Promise,必须通过await获取最终结果,且await只能在async函数或ES模块顶层中使用:
// 示例:在async函数中调用 async function fetchUserData() { const database = new db(); // 用await拿到普通数据对象 const userData = await database.findOne('你的搜索标识'); console.log(userData); // 输出 { name:'Johan', age:'15' } 这类目标对象 } fetchUserData(); // ES模块环境下可直接在顶层调用: // const database = new db(); // const userData = await database.findOne('你的搜索标识'); // console.log(userData);
关键说明
JS中异步操作无法完全绕过Promise直接同步获取结果,但await可以让代码写法接近同步逻辑,这是当前异步编程的标准方案。你之前看到的Promise { <pending> },就是因为没有等待异步操作完成,直接拿到了未完成的Promise对象。
内容的提问来源于stack exchange,提问作者Hi 1999
相关产品推荐
相关产品推荐

