节点同步功能

时间:2017-03-29 16:16:58

标签: javascript node.js

嗨,我正在尝试执行的功能出现问题。 我试图连接,编译和缩小一些jscoffeescript,当我对其进行硬编码时,我工作正常。我的问题是我现在创建了一个搜索文件并返回带有文件路径的数组的函数。但我无法以同步方式获得该功能。我已经尝试了很多东西,只是想不通。

在这个阶段,这就是我所拥有的,

此函数用于编译咖啡脚本,这也是由async.series调用的,可以正常工作。你可以看到它调用getFiles,它应该返回数组。但回调似乎在数据恢复之前触发了

function compileCoffee() {

    async.series([
        function(callback) {
            data = getFiles("coffee");
            callback(null, data)
        },
        function(data, callback) {
            console.log(data)
            shell.echo(grey("Compiling CoffeeScript files .... "));
            if (shell.cat(data).exec('coffee -sc').exec('uglifyjs --compress', {
                    silent: true
                }).to('./public/assets/js/app.min.js').code !== 0) {
                shell.echo(red('Coffee script compile error'));
                shell.exit(1);
            }
            shell.echo(green("CoffeeScript files compiled succesfully"));
        },
    ], () => {});
} 

然后这是get files函数。我很可能会把这一切都弄错,如果我愿意请让我知道一个更好的方法。如果没有,你知道如何使它工作将是惊人的。

function getFiles(filetype, callback) {

    var files = [];

    // Walker options
    var walker = walk.walkSync('./frontend/js', {
        followLinks: false
    });

    walker.on('file', function(root, stat, next) {
            // Add this file to the list of files
        var ext = stat.name.substr(stat.name.lastIndexOf('.') + 1);
        if (ext == filetype) {
            files.push(root + '/' + stat.name);
        }
        next();
    });

    walker.on('end', function() {
        console.lof(files)
        return files
    })

}

请帮助一下:D谢谢

1 个答案:

答案 0 :(得分:0)

getFiles实际上并没有返回任何内容,但确实需要在getFiles完成时调用的回调。将async回调传递给getFiles(或创建另一个调用回调的函数):

function(callback) {
  data = getFiles("coffee", callback);
},

您需要在getFiles函数中实际调用此回调:

walker.on('error', function(error) {
    console.log(error)
    callback(error);
});
walker.on('end', function() {
    console.log(files)
    callback(null, files);
});