我有一个奇怪的问题,我不确定我的问题在哪里。可能是因为我对节点流或乙烯基-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()
。我想我的第一个例子根本就不需要......
非常感谢任何提示或解释。
谢谢!
答案 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 )
});
});