在执行 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()
只有一个承诺)。
问题的背景,我正在使用 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()
只有一个承诺)。