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

「dbConnectの」、「クエリ」は、第1にこのコードでは「約束」どのように私は私の非同期コードは(私は約束を使用しています)JavaScriptでリファクタリングすることができます

で構成され、私のカスタムメソッドであり、私が取得firstResults(スキーマ=プログラム) i「はループのための」中firstResults.program_idを使用してnextsqlResults を取得し、割り当てた後firstresultとnextResults

を割り当てるオブジェクトの後、私は

どのように私はこのコードを開発することができ、結合データを応答?

答えて

1

Promise.allおよびArray.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

dbConnectの使用を検討してください:小さな関数に既存のコードを抽出することにより、あなたはこのようなあなたのコードを整理することができますものは読みやすくするために他に

、 ()のプロミスreturn conn(接続)、このコードでは、私はPromise.all()を使用することはできません。どうすればリファクタリングできますか? – WooHee

0

@Andyレイは素敵なソリューションを提供します。私はちょっとした改善を加えるだけです。

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

そして、あなたはより多くのそれを改善したい場合は、async/await

関連する問題