繁体   English   中英

如何使用final通过变量链传递变量

[英]How to pass variable through promise chain using finally

我正在尝试为Express API建立日志,但是在获取数据注销时遇到了问题。

我可以将原始reqres对象记录在finally块中,但是不确定如何访问SQL response

const sql = require("mssql")
const config = require("../config")

router.get("/express-route", (req, res) => {
  sql.connect(config.properties).then(pool => {
    return pool.request()
      .input('username', sql.NVarChar(32), req.params.username)
      .execute('do_something_with_username')
      .then(response => res.send(response) // pass this response
      .catch(err => res.send(err))
      .finally(() => {
        console.log('response', response)  // to here
        sql.close()
      })
  })
}

我将如何从第一个then块中获取响应并将其传递给finally块以在另一个函数中使用?

由于没有可靠的方法来确定诺言是否已兑现,因此finally回调将不会收到任何参数。 正是这种用例适用于您不关心拒绝原因或实现价值的情况,因此不需要提供它。 mdn

相反,只需使用.then

const sql = require("mssql")
const config = require("../config")

router.get("/express-route", (req, res) => {
  sql.connect(config.properties).then(pool => {
    return pool.request()
      .input('username', sql.NVarChar(32), req.params.username)
      .execute('do_something_with_username')
      .then(response => {res.send(response); return response;}) // pass this response
      .catch(err => res.send(err))
      .then(response => {
        console.log('response', response)  // to here
        sql.close()
      })
  })
}

实际上,您可以通过在异步函数中编写代码来简化事情

const sql = require("mssql")
const config = require("../config")

router.get("/express-route", (req, res) => {
  sql.connect(config.properties).then(async pool => {
    try {
        const response = await pool.request()
                         .input('username', sql.NVarChar(32), req.params.username)
                         .execute('do_something_with_username');

        // do another request
        const otherResponse = await pool.request() ... ;

        res.send(response);
    } catch (err) {
        res.send(err);
    } finally {
        sql.close();
    }
  })
}

这使您可以更线性地编写代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM