Node的del命令 - 回调未触发

Ste*_*eve 19 del node.js gulp

我正在通过一个关于gulp的复数课程.John Papa正在演示如何将一个删除现有css文件的函数注入到编译新文件的例程中.

del函数的回调没有触发.del函数正在运行,文件被删除,我看不到任何错误消息.如果我手动调用回调它会执行,所以看起来函数是完整的.所以我想知道什么会导致del不想执行回调.

删除例程:

function clean(path, done) {
    log('cleaning ' + path);
    del(path, done);   // problem call
}
Run Code Online (Sandbox Code Playgroud)

'done'函数没有触发,但如果我将代码更改为:

function clean(path, done) {
    log('cleaning ' + path);
    del(path);
    done();
}
Run Code Online (Sandbox Code Playgroud)

当然,在继续之前,这样做会使得等到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));
});
Run Code Online (Sandbox Code Playgroud)

注入清洁功能:

gulp.task('clean-styles', function(done){
    var files = config.temp + '/**/*.css';
    clean(files, done);
});
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果有其他人遇到这个,重新观看了培训视频,它正在使用del的v1.1.我查了一下,我正在使用2.x. 安装v 1.1后所有工作.

gfp*_*eco 23

del不是Node的命令,它可能就是这个 npm包.如果是这种情况,它不会收到回调作为第二个参数,而是返回一个promise,你应该调用.then(done)以在del完成后调用它.

更新

更好的解决方案是接受Gulp的承诺性质:

将您的clean功能更改为:

function clean(path) {
  return del(path); // returns a promise
}
Run Code Online (Sandbox Code Playgroud)

你的clean-styles任务是:

gulp.task('clean-styles', function(){
  var files = config.temp + '/**/*.css';
  return clean(files);
});
Run Code Online (Sandbox Code Playgroud)


Vit*_*kov 12

版本2.0开始,del的API更改为使用promises.

因此,要指定回调,您应该使用.then():

del('unicorn.png').then(callback);
Run Code Online (Sandbox Code Playgroud)

如果您需要从gulp任务中调用它 - 只需从任务中返回一个promise:

gulp.task('clean', function () {
  return del('unicorn.png');
});
Run Code Online (Sandbox Code Playgroud)