Javascript 为什么合并流需要异步完成信号?

Javascript 为什么合并流需要异步完成信号?,javascript,gulp,Javascript,Gulp,我正在从gulp@3.9.1到gulp@4.0.2并在此过程中升级我的吞咽依赖项。我的gulpfile中有以下任务,您可以假设目录只是我要对其执行此操作的目录数组: var gulp = require('gulp'); var ngAnnotate = require('gulp-ng-annotate'); //annotates dependencies in Angular components var rev = require('gulp-rev'); //appends a has

我正在从gulp@3.9.1到gulp@4.0.2并在此过程中升级我的吞咽依赖项。我的gulpfile中有以下任务,您可以假设
目录
只是我要对其执行此操作的目录数组:

var gulp = require('gulp');
var ngAnnotate = require('gulp-ng-annotate'); //annotates dependencies in Angular components
var rev = require('gulp-rev'); //appends a hash to the end of file names to eliminate stale cached files
var revReplace = require('gulp-rev-replace');
var uglify = require('gulp-uglify'); // minimizes javascript files
var compressCss = require('gulp-minify-css');
var useref = require('gulp-useref'); // replaces style and script blocks in HTML files
var filter = require('gulp-filter');
var merge = require('merge-stream');
var sourcemaps = require('gulp-sourcemaps');

function minify() {
    var tasks = directories.map(function (directory) {
        var cssFilter = filter("**/all.min.css", {restore:true});
        var jsAppFilter = filter("**/app.min.js", {restore:true});
        var jsFilter = filter("**/*.js", {restore:true});

        return gulp.src(dstBasePath + directory + "index.html", {allowEmpty: true})
            .pipe(useref())
            .pipe(cssFilter)
            .pipe(compressCss({keepSpecialComments:false}))
            .pipe(rev())
            .pipe(cssFilter.restore)
            .pipe(jsAppFilter)
            .pipe(sourcemaps.init())
            .pipe(ngAnnotate({add:true, single_quotes:true}))
            .pipe(jsAppFilter.restore)
            .pipe(jsFilter)
            .pipe(uglify())
            .pipe(rev())
            .pipe(jsFilter.restore)
            .pipe(revReplace())
            .pipe(sourcemaps.write('.'))    // sourcemaps need to be written to same folder for Datadog upload to work
            .pipe(gulp.dest(dstBasePath + directory))
    });

    return merge(tasks);
}
为什么这会导致运行任务时Gulp出现错误“您忘了发出异步完成信号了吗?”?请注意,我使用的是Gulp4。我尝试将回调
done
传递到此任务,并将
.addListener('end',done)
添加到最终管道,但这会导致合并流过早结束(可能是在第一个流结束时)。所以,也许其中一个插件在完成时没有发出信号,但如果不是这样,你怎么能让它工作呢?感谢您提供的任何见解。

返回合并(folders.map)(函数(folder){
//这在过去对我很有效

与此表单一样,没有
merge

gulp.task('init', function (done) {

  var zips = getZips(zipsPath);

  var tasks = zips.map(function (zip) {
  
    return gulp.src(zipsPath + "/" +  zip)
              
      .pipe(unzip({ keepEmpty: true }))
      
      .pipe(gulp.dest(path.join("src", path.basename(zip, ".zip"))))
      
      .on('end', function() {   // this bit is necessary
        done();
       });
  });

  return tasks;
});