Подтвердить что ты не робот

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 все работает.

4b9b3361

Ответ 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.