Node的del命令 - 回调未触发

时间:2015-09-24 21:05:10

标签: node.js gulp del

我正在通过一个关于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后所有工作。

3 个答案:

答案 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的人开始越来越多地融入节点代码。