我正在通过一个关于gulp的复数课程。 John Papa正在演示如何将一个删除现有css文件的函数注入到编译新文件的例程中。
del函数的回调没有触发。 del函数正在运行,文件被删除,我看不到任何错误消息。如果我手动调用回调它会执行,所以看起来函数是完整的。所以我想知道什么会导致del不想执行回调。
删除例程:
function clean(path, done) {
log('cleaning ' + path);
del(path, done); // problem call
}
'done'函数没有触发,但如果我将代码更改为:
function clean(path, done) {
log('cleaning ' + path);
del(path);
done();
}
当然,在继续之前,这样做会使del等待的目的失败。
对于正在发生的事情的任何想法将不胜感激。
供参考(如果相关):
编译css函数:
gulp.task('styles', ['clean-styles'], function(){
log('compiling less');
return gulp
.src(config.less)
.pipe($.less())
.pipe($.autoprefixer({browsers:['last 2 versions', '> 5%']}))
.pipe(gulp.dest(config.temp));
});
注入清洁功能:
gulp.task('clean-styles', function(done){
var files = config.temp + '/**/*.css';
clean(files, done);
});
更新
如果有其他人遇到此问题,请重新观看培训视频,并使用del的v1.1。我查了一下,我正在使用2.x.安装v 1.1后所有工作。
答案 0 :(得分:23)
del
不是Node的命令,它可能是this npm包。如果是这种情况,它不会收到回调作为第二个参数,而是返回一个承诺,你应该在.then(done)
完成后调用del
来调用它。
<强>更新强>
更好的解决方案是接受Gulp的承诺性质:
将clean
功能更改为:
function clean(path) {
return del(path); // returns a promise
}
您的clean-styles
任务:
gulp.task('clean-styles', function(){
var files = config.temp + '/**/*.css';
return clean(files);
});
答案 1 :(得分:12)
自version 2.0起,del的API已更改为使用promises。
因此,要指定回调,您应该使用.then():
del('unicorn.png').then(callback);
如果您需要从gulp任务中调用它 - 只需从任务中返回一个承诺:
gulp.task('clean', function () {
return del('unicorn.png');
});
答案 2 :(得分:4)
检查文档for the del package,看起来您在节点的标准回调机制和使用承诺的del / s之间混淆了。
您希望使用promise API,使用.then(done)来执行回调参数。
一般来说,节点和javascript在处理异步代码的设计模式方面目前处于不稳定状态,大多数浏览器社区和标准人员倾向于承诺,而Node社区倾向于回调风格和库等async。
随着ES6标准化承诺,我怀疑我们会在节点中看到更多这类不兼容性,因为热衷于该API的人开始越来越多地融入节点代码。