节点的 del 命令 - 回调不触发

Node's del command - callback not firing

我正在学习关于 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 后一切正常。

del 不是 Node 的命令,它可能是 this npm 包。如果是这种情况,它不会收到回调作为第二个参数,而是 returns 一个承诺,您应该调用 .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);
});

查看文档 for the del package 看来您混淆了节点的标准回调机制和使用承诺的 del 机制。

您需要使用 promise API 和 .then(done) 来执行回调参数。

Node 和 javascript 总体上目前在处理异步代码的设计模式方面处于一种不断变化的状态,大多数浏览器社区和标准人员倾向于承诺,而 Node 社区倾向于朝向回调风格和一个库,如异步。

随着 ES6 标准化承诺,我怀疑我们会在节点中看到更多此类不兼容性,因为对此充满热情的人们 API 开始越来越多地合并到节点代码中。

version 2.0 起,del 的 API 更改为使用 promises。

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

del('unicorn.png').then(callback);

如果您需要从 gulp 任务调用它 - 只需 return 来自任务的承诺:

gulp.task('clean', function () {
  return del('unicorn.png');
});