【问题标题】:How can I execute a function right after an "await" request has been completed?如何在“等待”请求完成后立即执行功能?
【发布时间】:2021-03-05 00:55:21
【问题描述】:

关于 Promises 和 async 等的整件事让我发疯了。每当我连接到数据库时,我只需要运行一个函数。 (这段代码运行良好,但我不知道await 何时完成。求助!

async function connectToDB() {
    console.log("Connecting to database...");
    database = await pool.connect();
    // I want to run some function only after the connection has been made.
}

我正在使用 node.js 和 postgreSQL 作为数据库管理器。

【问题讨论】:

  • 我不明白这个问题。 pool.connect() 是否返回一个完成后解决的承诺?如果是这样,只需将您的函数调用放在下一行,直到pool.connect() 解决它的承诺,它才会被调用。如果您没有使用 pool.connect() 返回承诺的数据库版本,那么您需要为支持承诺的数据库切换到不同的模块。
  • @jfriend00 这已经是漫长的一天,我实际上并没有测试......(它有效)。如何将其标记为已解决?

标签: javascript node.js asynchronous promise async-await


【解决方案1】:

如果pool.connect() 返回一个在完成后解决的承诺,那么您只需将函数调用放在await 之后的下一行,直到pool.connect() 解决其承诺时才会调用它。

如果您没有使用pool.connect() 返回承诺的数据库版本,那么您需要为支持承诺的数据库切换到不同的模块。

当然,如果pool.connect() 承诺被拒绝,那么它将跳过函数的其余部分(类似于throw)并且你的函数的调用者将看到你的@987654327 的承诺被拒绝@函数返回。

async function connectToDB() {
    console.log("Connecting to database...");
    database = await pool.connect();
    callSomeFunctionHere();         // this will happen after pool.connect() resolves
}

【讨论】:

    【解决方案2】:

    异步函数返回一个Promise,当您await 一个异步函数时,您表示在该函数完成之前脚本不应继续

    您可以将// I want to run some function only after the connection has been made. 替换为您的代码,该代码只会在pool.connect() 完成后运行。

    您也可以await connectToDb(),因为您也将其设为异步函数。

    await connectToDb();
    // other code that is run immediately after connectToDb finishes 
    
    // --- OR ---
    
    connectToDb().then(() => { 
        // other code that is run immediately after connectToDb finishes 
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 2020-08-14
      • 2021-10-29
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多