我正在編寫Node.JS lambda函數,我需要使用回調調用一些API函數並傳遞其他參數。在循環中使用其他參數進行回調
代碼如下:
var s3 = ...;
for (var i = 0; i < data.foo.length; i++) {
var v1 = data.foo[i].name;
console.log("Loop: " + v1);
var params = { ... };
foo.method1(params, function(err, data1) {
console.log("Method1: " + v1);
s3.putObject(....);
});
}
這裏有兩個問題。
我不明白爲什麼,但裏面的回調傳遞給
foo.method1...
我一直的v1
相同的值(我猜想,這是該數組中的最後一個)。亞馬遜控制檯的碼檢驗建議我,這是一個不好的做法,在循環中創建一個函數:
不要在循環中做功能。
我想,p.1與p.2相關:-)這就是爲什麼我試圖創建一個命名函數並將其引用傳遞給foo.method1
。但它不起作用,因爲我無法在那裏傳遞其他參數v1
和s3
。我只能換其呼叫,如:
foo.method1(params, function(err, data1) {
myCallback(err, data1, v1, s3);
});
- 什麼沒有意義,因爲結果是一樣的。
提示:foo.method1
顯然是異步的。
我懷疑如何解決這個問題?
'v1'在每個函數的關閉中被捕獲。所有的函數引用'v1'的相同的活動副本,這是調用函數時的最後一個值。一個解決方案是使用'let',如下所述:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Cleaner_code_in_inner_functions – skirtle