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.
Спасибо за любую помощь.
Ответы
Ответ 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 файла на вашем сервисе, просто разместите свои аргументы где-нибудь.