我正在尝试使用Node和MySQL编写JavaScript对象作为购物任务的一部分。我想通过使其比函数式编程更多OOP来测试自己。我正在为Transaction对象创建一个构造函数,其中包含所选项目,需要数量和总成本的属性。此外,还有显示项目,选择项目和购买项目的方法。
首先,我想要一组唯一的itemID,这将是用户选择有效产品的验证。我有一个范围问题,如果在对象的范围中定义this.ids []是未定义的。我的解决方案是在本地定义它并将该数组作为参数传递以避免作用域。这个解决方案也不允许我访问Transaction对象的范围变量。
this.listProducts = function(connection) {
connection.query("SELECT * FROM products WHERE stock_quantity>0", function(err,res) {
if (err) throw err;
this.ids = [];
for (var i = 0; i < res.length; i++) {
this.ids.push(res[i].item_id);
console.log(res[i].item_id + " " + res[i].product_name + " " + res[i].price);
}
// res.forEach(function (element) {
// console.log("this.ids=",this.ids);
// this.ids.push(element.item_id);
// console.log(element.item_id + " " + element.product_name + " " + element.price);
// });
connection.end();
console.log(this.totalCost, this.ids);
});
};
我试过
....
console.log(this.totalCost, this.ids);
});
}.call(this);
我得到TypeError: connection.query(...).call is not a function
我的范围是否全部搞砸了?如何修复范围问题,以便我可以访问&#34;事务&#34;对象的范围?
如果我的问题没有连贯地表达,请告诉我......
答案 0 :(得分:1)
我相信你可以使用两种选择
新的arrow函数,它将其绑定到定义的任何位置。
this.listProducts = function(connection) {
var that = this;
connection.query("SELECT * FROM products WHERE stock_quantity>0",
//use arrow instead of anonymous function
(err,res) => {
if (err) throw err;
this.ids = [];
for (var i = 0; i < res.length; i++) {
this.ids.push(res[i].item_id);
console.log(res[i].item_id + " " + res[i].product_name + " " + res[i].price);
}
connection.end();
console.log(this.totalCost, this.ids);
});
}
或存储 此 引用,如
this.listProducts = function(connection) {
var that = this;
connection.query("SELECT * FROM products WHERE stock_quantity>0", function(err,res) {
if (err) throw err;
that.ids = [];
for (var i = 0; i < res.length; i++) {
that.ids.push(res[i].item_id);
console.log(res[i].item_id + " " + res[i].product_name + " " + res[i].price);
}
connection.end();
console.log(that.totalCost, that.ids);
});
}