0

正在做一个零件价格查询的小系统 用的 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;

});

2个回答

0

已采纳

node 版本 7.6.0 以上:

let ids = [1,2,3...]; //多个零件id
ids.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);
});
0

因为nodejs里面都是异步处理数据,所以你的代码两个查询会异步执行,也就是同时的,想要实现同步,最简单的方法是嵌套,可以把sql数据封装好,写个callback回调,得出查询结果,再再回调函数里执行下一个sql查询。

还有方法就是使用插件,你说的async,await,是最近出来最好的方法,await必须写在async里面,相当于等一下再执行下一步,也就可以将代码变成同步了,比如nodejs不能用for循环,但await写进for循环之后,就可以用了。

还有方法就是Stepasync的类库,注意这里的async跟上面的可不一样。

具体怎么操作,网上搜索都有的,希望对你有帮助

撰写答案