【问题标题】:Accessing 'this' scope variable from callback从回调访问“this”范围变量
【发布时间】: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 的值不会一直这样。

标签: javascript node.js callback mongoose


【解决方案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); //&lt;--- 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 ...
        }
    );
});

另外,如果这是真正的代码,那么它在最后一个 ')' 之前缺少一个 '}'。

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 2011-11-04
    • 1970-01-01
    • 2012-07-16
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多