2013-03-31 55 views
1

我在貓鼬偶然發現了一個問題,最近試圖創建一個回調的文檔,其值,這裏是我的代碼:貓鼬:在外環

var v, query; 
for(var i=0; i<values.length; i++) { 
    v = values[i]; 
    query = model.findOne({type:v}); 
    query.exec(function(err, doc) { 
     if(doc == undefined) { 
     var m = new model({type:v, count:0}); 
     // but the 'v' above is not the values[i] in the for loop 
     // code to save comes here 
     } else { 
     doc.count++; 
     // update code comes here 
     } 
    }); 
} 

我想檢查,如果文檔是空的,如果是這樣,請在數據庫中輸入默認值。如果有文檔返回,則更新其屬性。問題是我試圖保存的對象具有值[i]作爲它的一個屬性。但是由於它是一個回調函數,我沒有得到那個特殊的值,因爲它在for循環中繼續前進。

我在模型創建過程中通過爲所有不同的值插入默認對象來解決這個問題,但是在代碼流的這一點上有沒有辦法做到這一點?

回答

2

試試這個:

values.forEach(function(v) { 
    var query = model.findOne({type:v}); 
    query.exec(function(err, doc) { 
    if(doc == undefined) { 
     var m = new model({type:v, count:0}); 
     // but the 'v' above is not the values[i] in the for loop 
     // code to save comes here 
    } else { 
     doc.count++; 
     // update code comes here 
    } 
    }); 
}); 

它不以for循環工作的原因是因爲JavaScript沒有塊範圍,這意味着在該塊中引用的v變量被重用,而不是重建。

當您立即使用的變量(就像model.findOne({ type: v}),這不是一個問題,但由於對query.exec回調函數將(可能)循環完成後執行,在回調v變量將只包含的最後一個值v在循環。

使用forEach,你創建一個新的變量v每次。

+0

啊,我今天新學到了一些東西。謝謝! – Raghuveer