【问题标题】:Node's del command - callback not firing节点的 del 命令 - 回调未触发
【发布时间】:2015-12-22 14:52:57
【问题描述】:

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

【问题讨论】:

标签: node.js gulp del


【解决方案1】:

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

【讨论】:

  • 谢谢。有趣的是我试过了,但它抛出了一个错误。 .then(done()) 出于某种原因工作。让我震惊的是用 del(path, done) 观看视频,它正在工作。
  • 您确定拨打.then(done()) 有效吗?对我来说,您似乎只是(过早地)调用 done 函数并将其作为回调发送到 del 承诺。你会粘贴你在尝试.then(done)时遇到的错误吗?
  • 好点,当然它就在那里开火。这里是错误的:prntscr.com/8k3z3g
  • 在我看来这是 del 命令的错误(可能与路径有关),但由于 gulp 也使用承诺标准,我建议您开始将 clean 函数更改为return del(path); 和你的clean-styles 任务到return clean(files); 看看错误是否保持不变。
  • Gulp 的自述页面有一个与您类似的示例,take a look
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    查看文档for the del package,您似乎在 node 的标准回调机制和使用 promise 的 del 之间混淆了。

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

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

    随着 ES6 标准化 Promise 的出现,我怀疑我们会在 node 中看到更多此类不兼容问题,因为对那个 API 充满热情的人们开始越来越多地将其整合到 node 代码中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      相关资源
      最近更新 更多