在执行 promise -then-catch 时,我是否必须始终将参数包装到 promise

Do i have to always wrap an argument to a promise when doing promise -then-catch

问题的背景,我正在使用 express,node 和 mysql2。

基本上,我正在尝试 ping 数据库以验证连接。通过使用 Promise-then-catch 语法,我必须将 conn 传递给下一个 then 因为 .ping() 不会 return 任何东西,我将无法释放没有这种写法的连接

我的问题是这样的,

const p0 = Promise.resolve(conn) 

const p0 = conn

两者都有效,有什么理由我应该把它包装在 promise 中吗?如果我不这样做会有什么问题吗?

const mysql = require('mysql2/promise');


const pool = mysql.createPool({
  host: process.env.DB_HOST || 'localhost',
  port: parseInt(process.env.DB_PORT) || 3306,
  database: process.env.DB_NAME || 'playstore',
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  connectionLimit: parseInt(process.env.DB_CONNECTION_LIMIT) || 4,
  timezone: '+08:00',
});

const SQL_GET_APP_CATEGORIES = 'select distinct category from apps ';

pool
  .getConnection()
  .then((conn) => {
    console.info('ping-ing DB');
    const p0 = Promise.resolve(conn);
    const p1 = conn.ping();
    return Promise.all([p0, p1]);
  })
  .then((results) => {
    const conn = results[0];
    //Release connection
    conn.release();
    app.listen(PORT, () => console.log(`Running on http://localhost:${PORT}`));
  })
  .catch((e) => {
    console.log(`Cannot start server ${e}`);
  });

而不是这个:

pool
  .getConnection()
  .then((conn) => {
    console.info('ping-ing DB');
    const p0 = Promise.resolve(conn);
    const p1 = conn.ping();
    return Promise.all([p0, p1]);
  })

你可以这样写:

pool
  .getConnection()
  .then((conn) => {
    console.info('ping-ing DB');
    return conn.ping().then(() => conn);
  })

这基本上就是说,当 conn.ping() 解析时,你想让返回的承诺的解析值成为 conn。或者,如果它拒绝,返回的承诺将被拒绝。


你这样做的方式,没有理由用承诺来包装它。如果需要,可以将值传递给 Promise.all(),如:

return Promise.all([conn.ping(), conn]);

但是,我在这个答案开头的建议会更清晰,因为您对 conn.ping() 的解析值不感兴趣,而且您只有一个承诺(因此没有真正的理由使用 Promise.all() 只有一个承诺)。