将变量分配给回调函数的输出未定义

时间:2019-06-26 14:49:13

标签: javascript

此代码将读取目录,并将所有文件路径字符串放入数组中,但是,我想将它们存储在变量中,但是当我这样做时,然后尝试记录该数组-返回未定义。

    const fs = require('fs');
const path = require('path');

function filewalker(dir, done) {
    let results = [];

    fs.readdir(dir, function(err, list) {
        if (err) return done(err);

        var pending = list.length;

        if (!pending) return done(null, results);

        list.forEach(function(file) {
            file = path.resolve(dir, file);

            fs.stat(file, function(err, stat) {
                // If directory, execute a recursive call
                if (stat && stat.isDirectory()) {
                    // Add directory to array [comment if you need to remove the directories from the array]
                    results.push(file);

                    filewalker(file, function(err, res) {
                        results = results.concat(res);
                        if (!--pending) done(null, results);
                    });
                } else {
                    results.push(file);

                    if (!--pending) done(null, results);
                }
            });
        });
    });
};

const allData = filewalker("./data", function(err, data) {
    if (err) throw err;

    return data;
});



console.log(allData);

如何将此函数的输出数据存储在我的allData常量中?

干杯!

1 个答案:

答案 0 :(得分:0)

这可能不是您要寻找的答案,但是解决此问题的一种方法是在filewalker函数末尾隐式返回结果。 下一个问题是该函数是异步的,因此您必须等待其完成才能显示结果。

function openInAppBrowser() {
    // Open URL
    var open_url = 'http://www.sampleurl.com/sample.htm';
    inAppBrowserRef = cordova.InAppBrowser.open(open_url, '_blank', 'clearcache=yes,clearsessioncache=yes,location=yes,hardwareback=no,zoom=no');
    // Add event listener to close the InAppBrowser
    inAppBrowserRef.addEventListener('message', messageCallBack);
};

function messageCallBack(params) {
    // Close the InAppBrowser if we received the proper message
    if(params.data.action == 'close') {
        inAppBrowserRef.close();
    }
};

一段时间后记录allData。在这里,您应该正确处理等待异步功能完成的过程。

    fs.readdir(dir, function(err, list) {
        if (err) return done(err);

        var pending = list.length;

        if (!pending) return done(null, results);

        list.forEach(function(file) {
            file = path.resolve(dir, file);

            fs.stat(file, function(err, stat) {
                // If directory, execute a recursive call
                if (stat && stat.isDirectory()) {
                    // Add directory to array [comment if you need to remove the directories from the array]
                    results.push(file);

                    filewalker(file, function(err, res) {
                        results = results.concat(res);
                        if (!--pending) done(null, results);
                    });
                } else {
                    results.push(file);

                    if (!--pending) done(null, results);
                }
            });
        });
    });
    return results;