1

私は 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
        }
    });
});
4

2 に答える 2

0
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);
});
于 2013-06-16T21:20:30.017 に答える
0

私が間違っていなければ、クロージャは 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 ...
        }
    );
});

また、これが実際のコードである場合、最後の「)」の前に「}」がありません。

于 2013-06-16T21:07:41.903 に答える