【问题标题】:How do I get my async function to return values not a promise?如何让我的异步函数返回值而不是承诺?
【发布时间】:2019-11-27 22:00:13
【问题描述】:

我是异步/等待功能的新手。我有一个获取数据库信息的函数,我想让函数setUpDb() 等到承诺完成后再返回。

const dbInfo = this.setUpDb();
console.log(dbInfo);

async setUpDb() {
    const appLoc = path.join(homedir(), ".tsa"); // temp db info
    const f: string = path.join(appLoc, "config.json");
    await fs.ensureFile(f);
    const temp = await fs.readJson(f);
    console.log(temp);
    return {
        dbHost: temp.dbHost,
        dbUser: temp.dbUser,
        dbPass: temp.dbPass
    };
}

我当前的输出是:Promise { <pending> },然后是temp 中的所有信息。

我只需要让 return 等到它返回之前有值。这可能吗?

谢谢!!

【问题讨论】:

  • 所有 JavaScript 函数同步返回。如果没有像自旋锁这样阻塞整个事件循环的东西,你不能让他们等待返回。 async 只是让它们返回一个 Promise,但它们仍然在任何异步代码运行之前返回。

标签: node.js typescript async-await


【解决方案1】:

您在异步功能完成之前记录。在记录之前等待承诺解决

let dbInfo;
this.setUpDb().then(result => {
  dbInfo = result;
  console.log(dbInfo);
});

【讨论】:

  • 太棒了!这样可行。谢谢。有没有办法在 .then() 之外获取信息?我会更新我的问题以使其更清楚。
  • 您正在使用异步代码,因此应用程序的 CONSUMING 部分必须能够处理等待异步脚本完成的处理。避免使用.then 的唯一方法是使用await,这需要应用程序的消费部分也以异步方法运行
  • 是的,我一直有这样的印象。只是不确定这是否可能。还是谢谢。
【解决方案2】:

我认为哮喘建议是最好的方法,但我认为你也可以这样做..

//const temp = await fs.readJson(f);
let temp;
await() => temp = fs.readJson(f);

(我可能错了)

【讨论】:

    【解决方案3】:

    你必须等待setUpDb函数的返回

    async setup() {
        const dbInfo = await this.setUpDb();
        console.log(dbInfo);
    }
    
    async setUpDb() {
        const appLoc = path.join(homedir(), ".tsa"); // temp db info
        const f: string = path.join(appLoc, "config.json");
        await fs.ensureFile(f);
        const temp = await fs.readJson(f);
        console.log(temp);
        return {
            dbHost: temp.dbHost,
            dbUser: temp.dbUser,
            dbPass: temp.dbPass
        };
    }
    

    【讨论】:

    • 是的,这也是一种选择。事实上,我过去曾使用过它。
    猜你喜欢
    • 2018-12-22
    相关资源
    最近更新 更多