【发布时间】:2016-02-04 18:39:49
【问题描述】:
我是 node.js/sails.js 的新手。我听说 node.js 非常快。但我的表现很差。在这里,我使用了 bluebird 作为 promise。基本上我想重构它,这样它会更快。在这里,我正在执行四种不同的查询来获取产品详细信息(名称、型号、描述等)、产品附加图像、产品选项和每个选项的详细信息。
我想知道如何将这四个查询拆分为四个不同的方法或函数,以便我以后可以重用它们,而且当我调用 getgetProductdetails 时,这将调用所有四个查询并更快地获得最终结果。请帮助我。我被困住了。非常感谢。
// api/model/product.js
getProductDetails:function(product_id){
return new Promise(function(resolve, reject) {
var product={},options=[];
//details
Product.query("select * from product p , product_description pd where p.product_id="+product_id+" and pd.product_id= p.product_id and pd.language_id=1",function(error, details) {
//images
Product.query("SELECT * FROM product_image WHERE product_id = "+product_id+" ORDER BY sort_order ASC",function(error, images) {
//options
Product.query("SELECT * FROM product_option po LEFT JOIN `option` o ON (po.option_id = o.option_id) LEFT JOIN option_description od ON (o.option_id = od.option_id) WHERE po.product_id = "+product_id+" AND od.language_id = '1' ORDER BY o.sort_order",function(error, options) {
options.forEach(function (item) {
//options value
Product.query("SELECT * FROM product_option_value pov LEFT JOIN option_value ov ON (pov.option_value_id = ov.option_value_id) LEFT JOIN option_value_description ovd ON (ov.option_value_id = ovd.option_value_id) WHERE pov.product_id = "+product_id+" AND pov.product_option_id = "+item.product_option_id+" AND ovd.language_id = '1' ORDER BY ov.sort_order",function(error,option_value){
options.push({options: item, option_value: option_value});
});
});//foreach option
product={details:details[0], options: options, images:images};
resolve(product);
});
});
});
});
}
【问题讨论】:
-
您正在运行多少个查询(以及您有多少数据)?那些没有事务的嵌套循环查询应该会破坏任何东西的性能。
-
好吧,我可以理解数据量和查询会降低性能。但是如果我在 php 中做同样的事情,它非常快,但不是在这里。所以我想知道如何将这些查询拆分为不同的方法/函数。你有答案吗?
-
我会开始优化您的查询,这样您就不会在紧密循环中调用非事务左连接。
-
我不知道如何在 node.js 中做到这一点
标签: javascript node.js promise sails.js bluebird