2017-09-13 34 views
0
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 } 
    )); 
    }) 
}); 
}); 

“数据库连接”我的异步代码,“查询”是我的自定义方法,它包括“无极”我如何重构的JavaScript(我使用的是无极)

在这个问题,首先我得到firstResults(模式=程序) 后,我得到了“for循环” 和对象分配FIRSTRESULT nextResults使用firstResults.program_id nextsqlResults和

分配后,我响应组合数据

我怎么能开发这个代码?

回答

1

Promise.allArray.map会帮助你在这里。未经测试:

dbConnect(res).then(conn => { 
    return query(conn, res, `SELECT * FROM programs WHERE user_id = ?`, [ 
     user_id, 
    ]); 
}).then(programList => { 
    return Promise.all(programList.map(program => 
     query(
      conn, 
      res, 
      `SELECT * FROM open_programs WHERE program_id = ?`, 
      [program.program_id], 
     ).then(opList => { 
      console.log(program); 
      return Object.assign(program, { openList: opList }); 
     }); 
}).then(result => { 
    conn.release(); 
    res.json(toRes(SUCCESS, { data: result })); 
}); 

您应该验证result是你正在寻找此代码后的数据结构。

荡涤多与babel-plugin-transform-object-rest-spread插件一点:

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 })); 
}); 
+0

数据库连接()的Promise return conn(connection),所以这个代码我不能在Promise.all()时使用conn。我如何重构? – WooHee

0

@Andy雷提供了一个很好的解决方案。我只是想增加一些额外的改进。

在其他做的事情可读,通过提取现有的代码为更小的功能,你可以组织这样的代码:

connectDb(res) 
    .then(selectPrograms) 
    .then(populateOpenPrograms) 
    .then(handleResult); 

如果你想更多的改进,可以考虑使用async/await