2017-09-13 42 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