Node.js 节点';s del命令-回调未触发
我正在学习一门关于吞咽的多视力课程。John Papa正在演示如何将删除现有css文件的函数注入到编译新css文件的例程中 del函数上的回调未触发。del函数正在运行,文件被删除,我没有看到任何错误消息。如果我手动调用回调函数,它就会执行,因此看起来该函数是得体的。所以我想知道是什么原因导致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
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的自述页面有一个与您类似的示例。可能是重复的