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

Gulp: где определена функция обратного вызова задачи gulp?

Задача в gulp может быть определена следующим образом:

gulp.task('foobar', function(callback) { ... });

Я пытаюсь понять, что такое функция обратного вызова. Где это определено? Могу ли я передать какую-либо другую функцию в качестве аргумента во время выполнения? Что он делает?

Эти документы указывают, что аргумент обратного вызова является подсказкой для Orchestrator о том, что задача должна выполняться асинхронно, когда выполнение обратного вызова указывает, что задача async завершена.

С некоторыми экспериментами он выглядит как вызов обратного вызова без аргументов, возвращает состояние успеха, а вызов его с некоторой строкой вызывает ошибку:

gulp.task('foobar', function(callback) {
    callback();
});

gulp.task('bazkad', function(callback) {
    callback("some string");
});  

(в сторону: как поместить разрыв между кодами в методе StackOverflow?)

$ gulp foobar
[09:59:54] Using gulpfile ~\repos\gulpproj\gulpfile.js
[09:59:54] Starting 'foobar'...
[09:59:54] Finished 'foobar' after 56 μs
$ gulp bazkad
[10:05:49] Using gulpfile ~\repos\gulpproj\gulpfile.js
[10:05:49] Starting 'bazkad'...
[10:05:49] 'bazkad' errored after 55 μs
[10:05:49] Error: some string
    at formatError (~\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:169:10)
    at Gulp.<anonymous> (~\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:195:15)
    at Gulp.emit (events.js:107:17)
    at Gulp.Orchestrator._emitTaskDone (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:264:8)
    at ~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:275:23
    at finish (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:21:8)
    at cb (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:29:3)
    at Gulp.<anonymous> (~\repos\gulpproj\gulpfile.js:35:5)
    at module.exports (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:34:7)
    at Gulp.Orchestrator._runTask (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:273:3)

Итак, у меня есть вопросы:

  • Является ли это единственной функциональностью обратного вызова, чтобы вызвать исключение, если передано аргумент и успешно завершить его в противном случае, или он сделает что-то еще?
  • Могу ли я переопределить его с помощью какой-либо другой функции (и для этого была бы разумная причина)?

Возможно, мои навыки чтения документации не сработали (я бы не первый раз), но я не могу найти ответы на эти вопросы в документах API.

Спасибо за любую помощь.

4b9b3361

Ответ 1

Функция обратного вызова поступает от Orchestrator (или нового - гробовщика - в Gulp 4) и фактически является не чем иным, как вызовом, чтобы сообщить системе задач, что ваша задача выполнена. Вот почему они изменили его на

gulp.task('something', function(done) { ... });

В будущих документах, чтобы сделать эту точку более ясной.

Зачем вам нужен обратный вызов? Как правило, вы возвращаете поток при определении задачи:

gulp.task('goodstuff', function() {
    return gulp.src('./app/**/*.*')
        .pipe(someotherstuff())
        .pipe(gulp.dest('./dist');
});

Возвращая поток, система задач может планировать выполнение этих потоков. Но иногда, особенно когда вы находитесь в callback-аде или называете какой-то потоковый плагин, вы не можете вернуть поток. Для этого нужен обратный вызов. Чтобы система задач узнала, что вы закончили, и перейдите к следующему вызову в цепочке выполнения.

На ваши вопросы:

Является ли это единственной функциональностью обратного вызова, чтобы вызвать исключение, если передано аргумент и успешно выполнить его в противном случае?

Нет, единственная функция - позволить системе задач знать, что ваша задача выполнена.

Есть ли что-нибудь еще, что он делает?

Нет.

Могу ли я переопределить его с помощью какой-либо другой функции (и для этого была бы разумная причина)?

Нет и Нет.

Можно ли передать любые другие аргументы функции задачи Gulp?

Нет, но зачем вам? У вас есть полный объем JS файла на вашем сервисе, просто разместите свои аргументы где-нибудь.