Promise链怎么写?

How to write Promise chain?

当我尝试进行一些数据库搜索时,我发现了两种代码可以执行 this.But 我不知道哪个更喜欢以及为什么..

// a.js
export default oracledb.createPool(configuration)

第一种方式(貌似效果不错,但不符合promise规格):

// b.js
import main from a.js;
main.then((pool)=>{
    pool.getConnection().then((connection)=>{
        connection.execute(sql).then((result)=>{
           console.log(result);
           connection.close();
        }).catch(err=>{
           if(connection){connection.close()}
        })
    });
})

这是第二种方式:

let connection;
main.then((pool)=>{
    return pool.getConnection()
}).then((connection)=>{
   return connection.execute(sql)
}).then((result)=>{
   console.log(result);
   connection.close();
}).catch(err=>{
   if (connection){connection.close()}
});

这个问题可能不只是关于数据库操作,而是组织承诺的正确方法chain.Can有人帮我吗?

使用此文档https://oracle.github.io/node-oracledb/doc/api.html

const mypw = ...  // set mypw to the hr schema password

async function run() {

  let connection;

  try {
    connection = await oracledb.getConnection(  {
      user          : "hr",
      password      : mypw,
      connectString : "localhost/XEPDB1"
    });

    const result = await connection.execute(
      `SELECT manager_id, department_id, department_name
       FROM departments
       WHERE manager_id = :id`,
      [103],  // bind value for :id
    );
    console.log(result.rows);

  } catch (err) {
    console.error(err);
  } finally {
    if (connection) {
      try {
        await connection.close();
      } catch (err) {
        console.error(err);
      }
    }
  }
}

run();

使用 promises 的一个主要想法是避免回调地狱,但是你写的第一段代码也可能成为级联地狱。第二种结构更好,更易于阅读和调试:

let connection

main
.then(pool => pool.getConnection())
.then(connection => connection.execute(sql))
.then(result => {
   console.log(result)
   connection.close()
})
.catch(err => {
   if (connection) connection.close()
})