Node.js 如何在javascript中重构异步代码(我正在使用Promise)

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”、“query”是我的自定义方法,由“Promise”组成

在这段代码中,首先我得到firstResultsschema=programs 在“for循环”中使用firstResults.program_id获取nextsqlResults之后 和对象分配firstresult和NextResult

分配后,我响应组合数据

如何开发此代码?

并将在这里帮助您。未经测试:

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);