You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何消除Promise,让JavaScript异步函数直接返回普通数据对象?

问题解决:async方法返回Pending Promise的问题

错误原因

你的代码存在两个核心问题:

  1. 未等待异步操作完成:this.collection.doc(search).get()是异步方法,返回Promise,直接赋值给doc会得到处于pending状态的Promise对象,而非实际的文档数据。
  2. 变量名拼写错误:代码中写了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:05:22