运行 gulp 个异步任务中的方法

Run gulp methods inside a single task asynchronously

var gulp = require('gulp');
var gutil = require('gulp-gutil');
var sass = require('gulp-sass');
var rename = ('gulp-rename');

gulp.task('test', function() {
    function compileSass() {
        return new Promise(function(resolve, reject) {
            gulp.src('test.scss')
                .pipe(sass())
                .pipe(gulp.dest('.'))
                    .on('end', resolve());
        });
    }

    compileSass().then(function(result) {
        gulp.src('test.css')
            .pipe(rename('testCopy.css'))
            .pipe(gulp.dest('.'));
    })
    .catch(function(error) {
        gutil.log(error);
    });    
});

我想做的就是 运行 这些 gulp.src 异步方法,这样 test.scss 文件将在 test.css 被下一个 [复制之前编译] =17=]方法。我试过使用回调、承诺(在本例中)和 async/await,但我永远无法在新的 运行 上同时获得 test.css 和 testCopy.css。我明白,如果我只是将这两个 gulp.src 方法放入单独的任务中,我会得到我正在寻找的异步功能,但如果我不必每次都创建一个新任务,那将非常有帮助一次我要modify/copy一个文件。谢谢!

var gulp = require('gulp');
var gutil = require('gulp-gutil');
var sass = require('gulp-sass');
var rename = ('gulp-rename');

gulp.task('test', function() {
    function compileSass() {
        return new Promise(function(resolve, reject) {
            gulp.src('test.scss')
                .pipe(sass())
                .pipe(gulp.dest('.'))
                    .on('end', resolve); // changed resolve() to just resolve
        });
    }

    compileSass().then(function(result) {
        gulp.src('test.css')
            .pipe(rename('testCopy.css'))
            .pipe(gulp.dest('.'));
    })
    .catch(function(error) {
        gutil.log(error);
    });    
});

我设法找到了我的问题...我只需要更改 resolve() 即可解决。老实说,不太确定为什么会这样,但现在可以了。如果你出于任何原因想使用 resolve() ,我试着把它放在一个同样有效的箭头函数中:

.on('end', () => resolve() );

// OR

.on('end', function() {
  resolve();
});

// OR

.on('end', resolve);

编辑:我知道在开始学习这些东西时异步狗屎会让人感到困惑,所以这里有一个使用回调而不是承诺的例子。

function compileSass(callback) {
      gulp.src('test.scss')
          .pipe(sass())
          .pipe(gulp.dest('.'))
              .on('end', callback);
  }

  compileSass(function() {
      gulp.src('test.css')
          .pipe(rename('testCopy.css'))
          .pipe(gulp.dest('.'));
  });

我不知道您是否计划在未来使用更复杂的管道,但这不仅对您有用:

gulp.task('test', function() {
     return gulp.src('test.scss')
      .pipe(sass())
      .pipe(gulp.dest('.'))
      .pipe(rename('testCopy.css'))
      .pipe(gulp.dest('.'));
});

我缺少了什么?