将参数或数据从观察者传递给任务的一种可能方式。我通过使用全局变量,或在两个块范围内的变量。这是一个例子:
gulp.task('watch', function () {
//....
//json comments
watch('./app/tempGulp/json/**/*.json', function (evt) {
jsonCommentWatchEvt = evt; // we set the global variable first
gulp.start('jsonComment'); // then we start the task
})
})
//global variable
var jsonCommentWatchEvt = null
//json comments task
gulp.task('jsonComment', function () {
jsonComment_Task(jsonCommentWatchEvt)
})
在这里,执行任务的函数可以在任何人感兴趣的情况下工作,但是知道我不需要将工作放在这样的另一个函数中,我可以直接在任务中实现它。对于文件,你有你的全局变量。这里是jsonCommentWatchEvt。但是要知道,如果您不像我那样使用函数,一个好的做法是将全局变量的值分配给您将要使用的本地变量。您在任务的所有顶部条目中执行此操作。所以你不会使用全局变量本身。并且避免了它可以被另一个手表处理触发改变的问题。当它被当前正在运行的任务继续使用时。
function jsonComment_Task(evt) {
console.log('handling : ' + evt.path);
gulp.src(evt.path, {
base: './app/tempGulp/json/'
}).
pipe(stripJsonComments({whitespace: false})).on('error', console.log).
on('data', function (file) { // here we want to manipulate the resulting stream
var str = file.contents.toString()
var stream = source(path.basename(file.path))
stream.end(str.replace(/\n\s*\n/g, '\n\n'))
stream.
pipe(gulp.dest('./app/json/')).on('error', console.log)
})
}
我有一个包含不同 json 文件的目录,我将在其中使用 cmets。我在看着他们。当文件被修改时,监视处理被触发,然后我只需要处理被修改的文件。为了删除 cmets,我使用了 json-comment-strip 插件。另外,我需要做更多的治疗。删除多个连续的换行符。 无论如何,首先我需要将路径传递给我们可以从事件参数中恢复的文件。 我通过全局变量将其传递给任务,仅此而已。允许传递数据。
注意:尽管这与问题无关,但在我的示例中,我需要处理从插件处理中流出的流。我使用了on("data" 事件。它是异步的。所以任务将在工作完全结束之前标记结束(任务到达结束,但启动的异步函数将继续处理一点)。所以你在任务结束时进入控制台的时间,不是整个处理的时间,而是任务块结束的时间。只是你知道的。对我来说没关系。