Node.js 如何在javascript中重构异步代码(我正在使用Promise)
“dbConnect”、“query”是我的自定义方法,由“Promise”组成 在这段代码中,首先我得到firstResultsschema=programs 在“for循环”中使用firstResults.program_id获取nextsqlResults之后 和对象分配firstresult和NextResult 分配后,我响应组合数据 如何开发此代码?并将在这里帮助您。未经测试:Node.js 如何在javascript中重构异步代码(我正在使用Promise),node.js,asynchronous,es6-promise,Node.js,Asynchronous,Es6 Promise,“dbConnect”、“query”是我的自定义方法,由“Promise”组成 在这段代码中,首先我得到firstResultsschema=programs 在“for循环”中使用firstResults.program_id获取nextsqlResults之后 和对象分配firstresult和NextResult 分配后,我响应组合数据 如何开发此代码?并将在这里帮助您。未经测试: dbConnect(res).then((conn)=>{ query(conn,res, `S
dbConnect(res).then((conn)=>{
query(conn,res,
`SELECT * FROM programs WHERE user_id = ?`,
[
user_id
]
).then((programList)=>{
new Promise((resolved,rejected)=>{
for(let i = 0; i<programList.length;i++){
query(conn,res,`
SELECT * FROM open_programs WHERE program_id = ?`,[programList[i].program_id])
.then((opList)=>{
Object.assign(programList[i],{openList : opList});
console.log(programList[i]);
if(i == (programList.length-1)){
resolved(programList)
}
})
}
}).then((result)=>{
conn.release();
res.json(toRes(SUCCESS,
{ data : result }
));
})
});
});
您应该验证结果是否为您在此代码之后要查找的数据结构
使用插件进行了更多清理:
@安迪·雷提供了一个很好的解决方案。我只想补充一些额外的改进 另一方面,为了使代码可读,通过将现有代码提取到更小的函数中,您可以像这样组织代码:
dbConnect(res).then(conn =>
query(conn, res, `SELECT * FROM programs WHERE user_id = ?`, [
user_id,
])
).then(programList =>
Promise.all(programList.map(program =>
query(
conn,
res,
`SELECT * FROM open_programs WHERE program_id = ?`,
[program.program_id],
).then(opList => ({
...program,
openList: opList
})
))
).then(result => {
conn.release();
res.json(toRes(SUCCESS, { data: result }));
});
如果你想进一步改进它,考虑使用
dBooCon的承诺返回CONN连接,所以这个代码我不能使用CONN当允诺。如何重构?dbConnect(res).then(conn =>
query(conn, res, `SELECT * FROM programs WHERE user_id = ?`, [
user_id,
])
).then(programList =>
Promise.all(programList.map(program =>
query(
conn,
res,
`SELECT * FROM open_programs WHERE program_id = ?`,
[program.program_id],
).then(opList => ({
...program,
openList: opList
})
))
).then(result => {
conn.release();
res.json(toRes(SUCCESS, { data: result }));
});
connectDb(res)
.then(selectPrograms)
.then(populateOpenPrograms)
.then(handleResult);