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