从回调访问“this”范围变量
Posted
技术标签:
【中文标题】从回调访问“this”范围变量【英文标题】:Accessing 'this' scope variable from callback 【发布时间】:2013-06-12 19:47:08 【问题描述】:我是 javascript 新手,我对以下代码有疑问。正在尝试从回调中设置价格值,但不起作用...请帮忙?
PreInvoiceSchema.pre('save', function(next)
//Seperating code from state
var codestate = addr[2].split(/[ ,]+/);
this.customer.zipcode = codestate[2];
this.customer.state = codestate[1];
//Calculating base price
if (this.order_subtype == "Upgrade")
this.price = 30;
else
this.price = 50;
var self = this;
for (var j = 0; j < this.work.length; j++)
Price.findOne(
"item": self.work[j].workproduct
, function(err, val)
if (self.work[j] != undefined)
self.work[j].workprice = 300; <-- this doesn't work
);
);
【问题讨论】:
j
的值不会一直这样。
【参考方案1】:
for (var j = 0; j < this.work.length; j++)
(function(i)
Price.findOne(
"item": self.work[i].workproduct
, function(err, val)
if (self.work[i] != undefined)
self.work[i].workprice = 300; <-- this doesn't work
);
)(j);
);
【讨论】:
另外,即使您的代码有效,我认为功能性(我的)方式比命令式(您的)方式更优雅。更少的错误空间。 谢谢大家,我试试 'lodash' 方法,但主要问题是在上下文变量上写...,即使我这样做 var self = this,它也没有分配新值到变量... 错字!是的,但是 functional 方式需要一个库,代码行太少,imo 没有必要 :) 我同意。如果你做一两次...... :) 它仍然不起作用:_.each(this.work, function(item) Price.findOne( "item": item.workproduct , function(err, val) console.log(item.workprice); //<--- this is '0' item.workprice = 300; ); );
当我检查数据库时,this.work[x].workprice
【参考方案2】:
如果我没记错的话,闭包会得到 j 的最后一个值。所以如果迭代从 0 运行到 3,那么你总是有 self.work[3].workprice = 300; (尝试追踪)。
尝试使用库 li lodash 并将您的代码变成如下内容:
_.each(this.work, function(item)
Price.findOne(
"item": item.workproduct ,
function(err, val)
// item.workprice ...
);
);
另外,如果这是真正的代码,那么它在最后一个 ')' 之前缺少一个 ''。
【讨论】:
以上是关于从回调访问“this”范围变量的主要内容,如果未能解决你的问题,请参考以下文章