Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我做“承诺-然后抓住”的时候,我必须总是把一个论点包装成一个承诺吗_Javascript_Promise_Mysql2 - Fatal编程技术网

Javascript 当我做“承诺-然后抓住”的时候,我必须总是把一个论点包装成一个承诺吗

Javascript 当我做“承诺-然后抓住”的时候,我必须总是把一个论点包装成一个承诺吗,javascript,promise,mysql2,Javascript,Promise,Mysql2,关于这个问题的背景,我在使用express、node和mysql2 基本上,我正在尝试ping数据库以验证连接。通过使用Promise-then-catch语法,我必须将conn传递到下一个then作为.ping()不返回任何内容,如果没有这种写入方式,我将无法释放连接 我的问题是, const p0 = Promise.resolve(conn) const p0 = conn 这两种方法都有效,有什么理由让我用承诺来包装它吗?如果我不这样做会有什么问题吗? constmysql=req

关于这个问题的背景,我在使用express、node和mysql2

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

我的问题是,

const p0 = Promise.resolve(conn) 

const p0 = conn
这两种方法都有效,有什么理由让我用承诺来包装它吗?如果我不这样做会有什么问题吗?
constmysql=require('mysql2/promise');
constpool=mysql.createPool({
主机:process.env.DB|u host | |“localhost”,
端口:parseInt(process.env.DB_port)| | 3306,
数据库:process.env.DB|u NAME | |“playstore”,
用户:process.env.DB_用户,
密码:process.env.DB_password,
connectionLimit:parseInt(process.env.DB_CONNECTION_LIMIT)| 4,
时区:‘+08:00’,
});
const SQL_GET_APP_CATEGORIES='从应用程序中选择不同的类别';
水塘
.getConnection()
。然后((连接)=>{
控制台信息(“ping-ing DB”);
const p0=承诺解决(conn);
常数p1=连接ping();
返回承诺。全部([p0,p1]);
})
。然后((结果)=>{
const conn=结果[0];
//释放连接
控制释放();
app.listen(端口,()=>console.log(`Running onhttp://localhost:${PORT}`);
})
.catch((e)=>{
log(`cannotstart 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()
只包含一个承诺)。

简言之,“我有什么理由用承诺来包装它吗?”,否。从
then
回调返回非承诺时,仍将从
then
返回承诺,并使用返回的回调值进行解析。请参阅:有关特定问题,请参阅副本(否,您不需要
承诺。解决
)。有关通过
ping
不传递值来解决问题的其他(更好)方法,请参阅