[英]Undefined Variable Inside Looped Async Function in Node.js
我正在構建一個功能,該功能將在服務器啟動或更改文件夾時自動掃描文件夾。 該腳本將為已安裝的小部件組裝一個小部件文件夾,然后連接並構建一個新的部分文件以包含在前端應用程序中。
該腳本如下所示:
concat.readMethodContents = function(concat) {
var widget;
for (widget in concat.widgets) {
var method;
for (method in concat.widgets[widget]) {
if (concat.widgets[widget][method].ready) {
concat.widgets[widget][method].ready = false;
fs.readFile('./lib/widgets/' + widget + '/methods/' + concat.widgets[widget][method].handle, 'utf8', function(err, data) {
if (err) {
console.log(err);
} else {
concat.widgets[widget][method].contents = data;
concat.writeJsPartialFile(concat);
}
});
}
}
}
}
在調用此方法之前, concat對象如下所示:
{
"widgets": {
"hello_world": [{
"handle": "method1.js",
"ready": true
}, {
"handle": "method2.js",
"ready": true
}, {
"handle": "method3.js",
"ready": true
}]
}
}
腳本的問題在於,調用方法時,由於循環已完成並且異步函數正在運行回調,因此將其定義為完成 。
如何通過操作的那一部分來封裝或保留變量?
我剛剛在這里回答了同樣的問題: 在查詢中從查詢訪問MongoDB值
您可以使用自執行函數來包裝閉包,以確保該值不會由於循環而在您下方改變。 嘗試類似:
concat.readMethodContents = function(concat) {
var widget;
for (widget in concat.widgets) {
var method;
for (method in concat.widgets[widget]) {
(function(widgetMethod) {
if (widgetMethod.ready) {
widgetMethod.ready = false;
fs.readFile('./lib/widgets/' + widget + '/methods/' + widgetMethod.handle, 'utf8', function(err, data) {
if (err) {
console.log(err);
} else {
widgetMethod.contents = data;
concat.writeJsPartialFile(concat);
}
});
}
})(concat.widgets[widget][method]);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.