在做promise时我是否必须总是将一个参数包装到promise上-然后捕获

问题描述

问题的背景,我使用express,node和MysqL2。

基本上,我正在尝试ping数据库以验证连接。通过使用Promise-then-catch语法,我必须将conn传递到下一个then,因为.ping()不返回任何内容,如果没有这种方式,我将无法释放连接写作。

我的问题是这个

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()解析时,您要使返回的Promise的解析值为conn。或者,如果拒绝,则返回的诺言也将被拒绝。


按照您的方式做,没有理由将其包装在承诺中。如果需要,您可以将值传递给Promise.all()

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

但是,由于您对conn.ping()中的解析值不感兴趣,并且您只有一个承诺,因此我在此答案开头的建议会更简洁(因此,没有真正的理由使用{{1} },并且只有一个承诺。