Javascript 如何写承诺链?

Javascript 如何写承诺链?,javascript,promise,node-oracledb,Javascript,Promise,Node Oracledb,当我试图进行一些数据库搜索时,我发现有两种代码可以这样做。但我不知道哪种更可取,为什么 // a.js export default oracledb.createPool(configuration) 第一种方法(似乎工作正常,但不符合承诺规范): 这是第二种方式: let connection; main.then((pool)=>{ return pool.getConnection() }).then((connection)=>{ return connec

当我试图进行一些数据库搜索时,我发现有两种代码可以这样做。但我不知道哪种更可取,为什么

// a.js
export default oracledb.createPool(configuration)
第一种方法(似乎工作正常,但不符合承诺规范):

这是第二种方式:

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()}
});
这个问题可能不仅仅与数据库操作有关,还与组织承诺链的正确方式有关。有人能帮我吗?

使用此文档


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

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()
})

承诺优于回调的一个更大的卖点是能够以一种简单的方式编写它们——也就是说,第二种方式。对于使用
async
wait
的一系列顺序异步操作来说,更好。第一种方式似乎类似于回调地狱,这就是承诺接管的地方,第二种方法使承诺变得容易处理。
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();
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()
})