Как gulp обрабатывает обещание then()?

У меня странное поведение при использовании gulp в качестве инструмента сборки. Я получил следующий код из другого вопроса, который предназначен для очистки файлов сборки перед другим запуском:

function clean() {
    var delResult = del(['build/**/*', 'dist/**/*']);
    return delResult.then(del(['build', 'dist']));
}

gulp.task('clean', clean);

Затем у меня есть задача по умолчанию, которая включает в себя задачу очистки в остальной части сборки:

gulp.task('default', gulp.series('clean', gulp.parallel('doJsStuff, doCssStuff', 'doEvenMoreStuff'));

Проблема в том, что gulp уже продолжает сборку до завершения двух операций del. Насколько я понимаю, then вернет обещание, и глоток должен продолжиться, когда это обещание будет выполнено. Конечно, then-обещание не может быть выполнено до того, как выполнится первое del-обещание. Поэтому я думаю, что это должно работать, как ожидалось, но это не так.
Поведение одинаково в gulp 3 и 4.

Я знаю, что могу сделать то же самое, используя только один del-вызов:

function clean() {
    return del(['build/**', 'dist/**']);
}

Это действительно работает и является решением моей проблемы. Еще я хотел бы понять, почему не работают прикованные промисы. Кто-нибудь может мне сказать?


person Fencer    schedule 18.07.2018    source источник
comment
.then() принимает функцию, а не Promise. Возможно, вы имели в виду return delResult.then(() => del(['build', 'dist']));?   -  person Patrick Roberts    schedule 18.07.2018
comment
Ах, я вижу, конечно, del(['build', 'dist']) будет выполняться сразу, а не после того, как первая del закончилась, потому что я передаю результат del в then, а не саму del-функцию. Очевидно, это приводит к недетерминированному поведению. Спасибо! Я с удовольствием приму ваш комментарий в качестве ответа.   -  person Fencer    schedule 31.07.2018