了解节点流和乙烯基-fs

时间:2015-10-13 15:05:00

标签: javascript node.js promise q

我有一个奇怪的问题,我不确定我的问题在哪里。可能是因为我对节点流或乙烯基-fs的一些基础知识缺乏了解。

无论如何,这是描述:

我正在构建我想要与gulp一起使用的不同脚本。

例如,这个正在构建我需要的一些资产;更确切地说,我正在将bootstrap源文件从node_modules复制到我的资产文件夹。

这个函数应该返回一个promise,这样我就可以更容易地使用gulp。

这是将执行此任务的sass-bootstrap.js文件:

  • 这是一个较短的版本,之前有一些检查,但与我的问题无关。
  • 假设所有变量都已定义。
var defer    = Q.defer(),
    vinylFs  = require( 'vinyl-fs' ),
    map      = require( 'map-stream' );

function sass_bootstrap() {
  var defer = Q.defer();
  vinylFs.src( [ bootstrap_sass_route + '/**/_*.scss' ] )
    .pipe( vinylFs.dest( assets_sass_bootstrap ) )
    .pipe( map( function( file, cb ) { 
      cb( null, file ); 
    }))
    .on( 'end', function(){
      defer.resolve();
    });
  return defer.promise;
}

这是使用它的gulp任务:

  • 再次是简化版,只包含相关代码
gulp.task( 'development', function ( cb ) {

  sass_bootstrap()
    .then( function(){
      cb();
    })
    .catch( function( err ){
      err.log();
      cb();
    });


});

这样做很好,但我不太明白为什么它不能这样工作:

function sass_bootstrap() {
  var defer = Q.defer();
  vinylFs.src( [ bootstrap_sass_route + '/**/_*.scss' ] )
    .pipe( vinylFs.dest( assets_sass_bootstrap ) )
    .on( 'end', function(){
      defer.resolve();
    });
  return defer.promise;
}

此外,我不明白为什么我需要拨打map()。我想我的第一个例子根本就不需要......

非常感谢任何提示或解释。

谢谢!

1 个答案:

答案 0 :(得分:1)

所以,这是一种反模式。

我们不应该混合承诺和流;这样做的正确方法是在sass_bootstrap上返回流并监听结束/错误事件:

<强> SASS-bootstrap.js

var vinylFs  = require( 'vinyl-fs' );

function sass_bootstrap() {
  return vinylFs
    .src( [ bootstrap_sass_route + '/**/_*.scss' ] )
    .pipe( vinylFs.dest( assets_sass_bootstrap ) )
}

gulp任务

gulp.task( 'development', function ( cb ) {
  return sass_bootstrap()
    .on( 'end', cb );
    .on( 'error' function( err ) {
      // Do error stuff
      cb( err )
    });
});