gulp:定义了gulp任务回调函数在哪里?

laf*_*oyb 26 node.js gulp

gulp中的任务可以这样定义:

gulp.task('foobar', function(callback) { ... });
Run Code Online (Sandbox Code Playgroud)

我试图了解回调函数是什么.它在哪里定义?我可以在运行时传递一些其他函数作为参数吗?它有什么作用?

这些文档表明回调参数是Orchestrator的提示,该任务应该异步运行,执行回调指示异步任务已完成.

通过一些实验,看起来调用没有参数的回调会返回成功状态,并使用某个字符串调用它会引发错误:

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

gulp.task('bazkad', function(callback) {
    callback("some string");
});  
Run Code Online (Sandbox Code Playgroud)

(除此之外:如何在StackOverflow markdown中的代码块之间放置一个中断?)

$ 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)
Run Code Online (Sandbox Code Playgroud)

所以,我有的问题是:

  • 这是回调的唯一功能,如果传递参数引发异常并以其他方式成功完成,或者它是否做了其他事情?
  • 我可以用其他一些功能覆盖它(并且有任何理智的理由这样做)吗?

也许我的文档阅读技巧让我失望(这不是第一次),但我似乎无法在API文档中找到这些问题的答案.

谢谢你的帮助.

ddp*_*rrt 37

回调函数来自Orchestrator(或新的 - 承诺者 - 在Gulp 4中),实际上只是一个告诉任务系统你的任务"完成"的调用.这就是他们改变它的原因

gulp.task('something', function(done) { ... });
Run Code Online (Sandbox Code Playgroud)

在即将到来的文档中,使这一点更加清晰.

你为什么需要回调?通常,在定义任务时返回流:

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

通过返回流,任务系统能够规划这些流的执行.但有时候,尤其是当你处于回调地狱或调用一些streamless插件时,你无法返回一个流.这就是回调的用途.让任务系统知道你已经完成并继续执行链中的下一个调用.

对你的问题:

这是回调的唯一功能,如果传递参数则引发异常并以其他方式成功完成?

不,唯一的功能是让任务系统知道您的任务已完成.

它有什么其他的吗?

没有.

我可以用其他一些功能覆盖它(并且有任何理智的理由这样做)吗?

不,不.

是否可以将任何其他参数传递给gulp任务函数?

不,但你为什么要这样?您可以在服务上拥有JS文件的全部范围,只需将您的参数放在某处即可.