正在做一个零件价格查询的小系统 用的 node.js+mysql
想实现的是通过零件的ID查询出价格
麻烦的地方是 一共有4间公司的数据,而零件会在哪一间或几间公司的数据中出现是未知的,而且需求一次查询多个零件的价格。即:
输入一个或多个零件ID,各ID返回4个价格。
现在用的代码如下,貌似只能跑一次查询。网上查了一下好像应该用 async? 请大神们指导
user.js
//根据零件编号得到价格User.getPriceByPartNo = function getPriceByPartNo(PRT_NO, callback) { pool.getConnection(function (err, connection) { var tblarr = ["JF","HT","GQ"]; var getPriceByPartNo_Sql = ["","","",""]; //var getPriceByPartNo_Sql1 = "SELECT PRT_NO, STOCK, SRP as JFSRP FROM car_db.jf WHERE PRT_NO in ("+instring+")"; for(var i=0; i<tblarr.length;i++) { getPriceByPartNo_Sql[i] = "select SRP as " + tblarr[i] + "SRP from car_db." + tblarr[i] + " WHERE PRT_NO = '"+ PRT_NO +"'"; } var sqlstring = getPriceByPartNo_Sql.join(";") + "select PART_NO_REPLACE from car_db.id_mapping WHERE PART_NO = '"+ PRT_NO+ "';"+ "select FLAG from car_db.LARGE WHERE PART_NO = '"+ PRT_NO+ "';"; console.log(sqlstring); connection.query(sqlstring, function (err, result) { connection.release(); if (err) { console.log("getPriceByPartNo Error: " + err.message); return; } console.log("invoked[getPriceByPartNo]"); console.log(result); }); });};
index.js
router.post('/', function(req, res) { var PRT_NO = req.body['partNo'], PRTARR = PRT_NO.toString().split(","), STOCK = null, JFSRP = null, HTSRP = null, CSSRP = null, GQSRP = null, FLAG = null, PRT_NO_REPLACE = null; var resultComb = [];for(var i=0; i<PRTARR.length;i++) { User.getPriceByPartNo(PRTARR[i], function (err, results) { resultComb[i] = [ PRTARR[i], results.JFSRP, results.HTSRP,results.CSSRP,results.GQSRP,results.PRT_NO_REPLACE, results.FLAG]; }); console.log(resultComb); if(resultComb == '') { res.locals.error = '零件不存在'; res.render('index',{title:'主页'}); return; }else{ } res.render("result",{title:"主页", result: resultComb});} return;
});
解决方案
node 版本 7.6.0 以上:
let ids = [1,2,3...]; //多个零件idids.map( v => { //遍历数组查询每个id的数据 (async v => { //es6的async/await try { let result = await Promise.all([ //分别查询四个公司 query1, //必须返回promise对象 query2, query3, query4, ]); // result 是一个结果数组,结果一一对应promise.all中的查询,结果为空就是空 } catch (err) { //do something error } })(v);});