Node команда del - обратный вызов не срабатывает
Я работаю по курсу множественного числа на gulp. Джон Папа демонстрирует, как внедрить функцию, которая удаляет существующие файлы 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);
});
UPDATE
Если кто-то еще сталкивается с этим, повторно просмотрел обучающее видео, и он использовал v1.1 del. Я проверил, и я использовал 2.x. После установки v 1.1 все работает.
Ответы
Ответ 1
del
не является командой Node, вероятно, этот пакет 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);
});
Ответ 2
Начиная с версии 2.0, API-интерфейс был изменен для использования promises.
Таким образом, чтобы указать обратный вызов, вы должны использовать .then():
del('unicorn.png').then(callback);
Если вам нужно вызвать его из задачи gulp - просто верните обещание из задачи:
gulp.task('clean', function () {
return del('unicorn.png');
});
Ответ 3
Проверка docs для пакета del, похоже, что вы смешиваете стандартный механизм обратного вызова node и del, что используя обещание.
Вы хотите использовать API обещаний с помощью .then(done), чтобы выполнить параметр обратного вызова.
Node и javascript в целом в настоящее время немного расплываются для шаблонов проектирования для обработки асинхронного кода, причем большинство сообществ сообщества и стандартов браузеров склоняются к promises, тогда как сообщество node имеет тенденцию в сторону стиля обратного вызова и библиотеки, такой как async.
При стандартизации ES6 promises, я подозреваю, что мы увидим больше этих несовместимостей в node, поскольку люди, которые увлечены этим API, начинают все больше входить в код node.