1

我正在尝试在 grunt 插件中创建一个流并且惨遭失败......

此代码作为独立节点脚本工作:

var fs = require('fs');

var sourceFile = 'testfile.log';

fs
    .createReadStream( sourceFile )
    .on('data', function() {
        console.log('getting data');
    })
    .on('end', function() {
        console.log('end!');
    });

输出

$ node test.js
getting data
end!

现在将其放入 grunt 插件时:

'use strict';

var fs = require('fs');

module.exports = function(grunt) {

    grunt.registerMultiTask('test', 'Testing streams', function() {

        var sourceFile = 'testfile.log';

        fs
            .createReadStream( sourceFile )
            .on('data', function() {
                console.log('getting data');
                grunt.log.oklns('anything?');
            })
            .on('end', function() {
                console.log('end!');
                grunt.log.oklns('nothing?');
            });

    });

};

输出

$ grunt test
Running "test" (test) task

Done, without errors.

我正在测试:

var stats = fs.lstatSync( sourceFile );
if( !stats.isFile() ) { /*etc*/ }

如果该文件存在但我的节点测试应用程序位于同一文件夹中并且可以访问...任何帮助表示赞赏。我知道这一定不会很难做到;)

4

1 回答 1

3

您在 Grunt 任务中使用异步代码。这样做时,您必须告诉 grunt 等待它完成。这是通过以下方式完成的:

    // Within the task

    var done = this.async();

    // inside a callback of an async function, 
    // i.e. when the read stream is closed */ 

    function(){
      done(true);
    }

以 true 条件调用 done 告诉 Grunt 任务已完成。如果this.async()未调用,则任务同步执行。在您的情况下,grunt 任务在读取流接收任何数据之前完成。

您可以在此处阅读有关此特定功能的更多信息(inside-tasks#this.async)

作为旁注,您提供的代码将任务注册为多任务,但代码(至少在其当前状态下)是基本任务而不是多任务。您可以在此处(基本任务)此处(多任务)阅读官方文档中的差异。

于 2015-05-17T23:58:19.947 回答