Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点';s del命令-回调未触发_Node.js_Gulp_Del - Fatal编程技术网

Node.js 节点';s del命令-回调未触发

Node.js 节点';s del命令-回调未触发,node.js,gulp,del,Node.js,Gulp,Del,我正在学习一门关于吞咽的多视力课程。John Papa正在演示如何将删除现有css文件的函数注入到编译新css文件的例程中 del函数上的回调未触发。del函数正在运行,文件被删除,我没有看到任何错误消息。如果我手动调用回调函数,它就会执行,因此看起来该函数是得体的。所以我想知道是什么原因导致del不想执行回调 删除例程: function clean(path, done) { log('cleaning ' + path); del(path, done); // pro

我正在学习一门关于吞咽的多视力课程。John Papa正在演示如何将删除现有css文件的函数注入到编译新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);
});
注入清洁功能:

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。安装v1.1后,所有工作都正常。

del
不是节点的命令,它可能是npm包。如果是这种情况,它不会收到作为第二个参数的回调,而是返回一个承诺,您应该调用
。然后(完成)
del
完成后调用它

更新

一个更好的解决方案是接受大口大口的承诺性质:

clean
功能更改为:

function clean(path) {
  return del(path); // returns a promise
}
您的
清洁样式任务要:

gulp.task('clean-styles', function(){
  var files = config.temp + '/**/*.css';
  return clean(files);
});
查看文档时,您似乎混淆了node的标准回调机制和del的回调机制,后者使用的是承诺

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

Node和javascript通常在设计模式处理异步代码时处于一种变化的状态,大多数浏览器社区和标准人员倾向于承诺,而Node社区倾向于回调样式和一个库,如async

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

自年起,del的API改为使用承诺

因此,要指定回调,应使用。然后()

如果您需要在吞咽任务中调用它,只需返回任务中的承诺:

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

谢谢有趣的是,我试过了,但出了个错误。然后(done())出于某种原因起作用。让我抓狂的是用del(path,done)观看视频,而且它正常工作。你确定调用
。然后(done())
有效吗?对我来说,您似乎只是在调用done函数(过早地)并将其返回作为回调发送给
del
promise。你会粘贴你在尝试
时遇到的错误吗?然后(完成)
?很好,当然它就在那里触发了。这里是错误:在我看来,这是
del
命令上的一个错误(可能与路径有关),但是由于gulp也使用了Promissions标准,我建议您开始将
clean
函数更改为
return del(path)和您的
清理样式
任务,以
返回清理(文件)
并查看错误是否保持不变。Gulp的自述页面有一个与您类似的示例。可能是重复的