节点的del命令 – callback不会触发
我正在通过一个吞咽复数的课程。 John Papa正在演示如何将一个删除现有css文件的函数插入到编译新函数的例程中。
del函数的callback不会触发。 del函数正在运行,文件被删除,我看不到任何错误信息。 如果我手动调用callback函数,它会执行,所以看起来像函数一样。 所以我想知道什么会导致DEL不想执行callback。
删除例程:
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)); });
注入清洁function:
gulp.task('clean-styles', function(done){ var files = config.temp + '/**/*.css'; clean(files, done); });
UPDATE
如果有其他人遇到这个问题,请重新观看培训video,并使用del的v1.1。 我检查了,我正在使用2.x. 安装v 1.1之后所有的作品。
del
不是Node的命令,可能是这个 npm包。 如果是这样的话,它不会收到一个callback作为第二个参数,而是返回一个承诺,你应该调用.then(done)
以获得del
之后调用完成。
更新
更好的解决scheme是拥抱Gulp的诺言性质:
改变你的clean
function:
function clean(path) { return del(path); // returns a promise }
而你clean-styles
任务:
gulp.task('clean-styles', function(){ var files = config.temp + '/**/*.css'; return clean(files); });
从版本2.0开始 ,del的API改为使用promise。
因此,要指定callback,你应该使用.then():
del('unicorn.png').then(callback);
如果你需要从一个咕嘟咕噜的任务中调用它 – 只要从任务中返回一个承诺:
gulp.task('clean', function () { return del('unicorn.png'); });
检查del包的文档看起来好像在节点的标准callback机制和使用承诺的del之间混淆了。
您将要使用承诺API与.then(完成)为了执行callback参数。
一般来说,Node和javascript在处理asynchronous代码的devise模式方面处于一种状态,大多数浏览器社区和标准人员倾向于承诺,而Node社区倾向于callback风格和库,例如asynchronous。
随着ES6标准化的承诺,我怀疑我们将会看到更多的节点不兼容性,因为那些热衷于API的人开始越来越多的融入到节点代码中。