【发布时间】:2020-11-03 03:00:29
【问题描述】:
问题背景,我使用的是 express、node 和 mysql2。
基本上,我正在尝试 ping 数据库以验证连接。通过使用 Promise-then-catch 语法,我必须将 conn 传递给下一个 then,因为 .ping() 不返回任何内容,如果没有这种写法,我将无法释放连接。
我的问题是这样的,
const p0 = Promise.resolve(conn)
const p0 = conn
两者都有效,有什么理由我应该将它包装在承诺中?如果我不这样做会有什么问题吗?
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}`);
});
【问题讨论】:
-
“有什么理由我应该将它包装在 promise 中吗?” 简而言之,没有。从
then回调返回一个非承诺仍然会从then返回一个承诺,它通过返回的回调值解决。见:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
对于特定问题,请参阅副本(不,您不需要
Promise.resolve)。有关解决问题的其他(更好)方法ping不传递值,请参阅How do I access previous promise results in a .then() chain?
标签: javascript promise mysql2