簡體   English   中英

Node.js中的循環異步函數中的未定義變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM