19

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

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

删除例程:

function clean(path, done) {
    log('cleaning ' + path);
    del(path, done);   // problem call
}

“完成”功能没有触发,但如果我将代码更改为:

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);
});

更新

如果其他人遇到这种情况,请重新观看培训视频,它使用的是 v1.1 的 del。我检查了一下,我使用的是 2.x。安装 v 1.1 后一切正常。

4

3 回答 3

25

del不是 Node 的命令,可能是这个npm 包。如果是这种情况,它不会收到回调作为第二个参数,而是返回一个 Promise,您应该.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);
});
于 2015-09-24T21:13:35.693 回答
12

2.0 版开始,del 的 API 改为使用 Promise。

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

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

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

gulp.task('clean', function () {
  return del('unicorn.png');
});
于 2015-10-01T11:32:08.170 回答
4

检查del 包的文档,看起来你在节点的标准回调机制和使用承诺的 del 之间混淆了。

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

总的来说,Node 和 javascript 目前在处理异步代码的设计模式方面处于不稳定状态,大多数浏览器社区和标准人员倾向于 Promise,而 Node 社区倾向于回调样式和库,例如异步的。

随着 ES6 标准化承诺的出现,我怀疑随着对 API 充满热情的人们开始越来越多地融入节点代码,我们将在节点中看到更多此类不兼容。

于 2015-09-24T21:20:51.453 回答