如何减少有时需要回调的代码重复?

时间:2019-01-21 23:20:49

标签: javascript callback gulp code-duplication

在gulpfile中,我有一个处理所有页面的任务,还有一个监视我的页面进行更改并仅处理已更改页面的任务。看起来像这样:

const buildPages = path => cb => {
  gulp.src(path)

    // some lines of piping

    .pipe(gulp.dest(pages.dist));

  cb();
}

const watchPages = () =>
  gulp.watch(pages.src).on('change', path =>
    gulp.src(path)

      // the same piping as above

      .pipe(gulp.dest(pages.dist))
  );

.on()返回的chokidar watcher对象的gulp.watch()方法没有收到回调函数,而其上方的gulp任务则需要一个回调函数。因此,要删除代码重复,我可以这样做:

const buildPages = path =>
  gulp.src(path)

    // some lines of piping

    .pipe(gulp.dest(pages.dist));

const buildPagesWithCallback = path => cb => {
  buildPages(path)
  cb();
}

const watchPages = () =>
  gulp.watch(pages.src).on('change', path =>
    buildPages(path)
  );

这是解决问题的正确方法,还是有一种无需创建额外功能即可删除重复项的方法(也许通过使观察者接收回调)?

1 个答案:

答案 0 :(得分:1)

不确定您的其他要求/需求是什么,但是根据您的描述,我通常会有这样的设置(假设您正在使用口香糖4):

const src = [ './src/pageA/**/*.js', ...others ];
const dist = './dist';

const buildPages = () => gulp.src(src).pipe(...).pipe(gulp.dest(dist));
const callback = () => { /* do stuff */ };

exports.buildPageWithCallback = gulp.series(buildPages, callback);
exports.watchPages = () => gulp.watch(src, gulp.series(buildPages));
exports.watchPageWithCallback = () => gulp.watch(src, gulp.series(buildPages, callback));

我将使用gulp.series运行回调,而无需将回调显式传递给任务制作器函数,而是直接将任务传递给gulp.watch

如果您的要求要求buildPages接受path,那么我认为您的做法是正确的,抱歉,如果我误解了这个问题