Javascript 一个gulp函数如何知道它内部调用的函数已经完成?

Javascript 一个gulp函数如何知道它内部调用的函数已经完成?,javascript,gulp,Javascript,Gulp,我正在编写一个gulp任务,将sass文件复制到tmp文件夹中,然后创建css function copy_sass(done) { var conponments = setup.conponments; var sassList = config.conponments.sass; var mainPath = config.path.src.sass.main; var rootPath = config.path.src.sass.root; var source

我正在编写一个gulp任务,将sass文件复制到tmp文件夹中,然后创建css

function copy_sass(done) {

  var conponments = setup.conponments;
  var sassList = config.conponments.sass;
  var mainPath = config.path.src.sass.main;
  var rootPath = config.path.src.sass.root;
  var source = getPaths(conponments, sassList, mainPath);// get a filtered list of path
  var destination = config.path.tmp.sass_tmp;

  copyPath(mainPath + 'mixin/**', destination + 'main/mixin/');
  copyPath(mainPath + 'settings/**', destination + 'main/settings/');
  copyPath(rootPath + 'style.scss', destination);
  copyPath(source, destination + 'main/conponment/');

  done();
};

function css_build(done) {
  var source = config.path.tmp.sass_tmp + '**/*.scss';
  var destination = config.path.tmp.css.root;

  return src(source)
    .pipe(bulkSass())
    .pipe(sass())
    .pipe(csscomb())
    .pipe(cssbeautify({indent: '  '}))
    .pipe(autoprefixer())
    .pipe(gulp.dest(destination));
  done();
};

function copyPath(source, destination) {
  return src(source)
    .pipe(dest(destination));
};

exports.getcss = series(
  copy_sass,
  css_build
);

exports.filter = filter_tmp_sass;

exports.css = css_build;
当我调用与任务getcss串联的函数时,gulp似乎不会在复制任务完成之前等待,css_build什么都不做,因为路径还没有被复制

当我手动启动复制任务和css任务时,一切都正常。所以我认为问题在于copy_sass函数在copyPath函数结束之前被视为已完成,然后在复制路径之前启动css_build

我所期望的是getcss任务在启动css_build之前要等到copy_sass函数和其中的copyPath函数完成

节点库以多种方式处理异步性

Gulp文件流(通常从
src()
开始)异步工作。这意味着,他们开始了某种工作,但在被呼叫时立即返回。这就是为什么您总是需要从任务返回流,以便Gulp知道任务的实际工作何时完成的原因,您可以在中阅读:

当任务返回流、承诺、事件发射器、子进程或可观察对象时,成功或错误会通知gulp是继续还是结束

关于您的具体示例,在任务
copy_sass
中,您多次调用
copyPath
。复制已开始,但方法会立即返回,而无需等待完成。之后,调用
done
回调,告诉Gulp任务已完成

为了确保任务完成,您需要将每一条流返回到Gulp。在您的示例中,您可以为每个复制操作创建一个单独的任务,并通过
series()
甚至
parallel()
聚合它们:

节点库以多种方式处理异步性

Gulp文件流(通常从
src()
开始)异步工作。这意味着,他们开始了某种工作,但在被呼叫时立即返回。这就是为什么您总是需要从任务返回流,以便Gulp知道任务的实际工作何时完成的原因,您可以在中阅读:

当任务返回流、承诺、事件发射器、子进程或可观察对象时,成功或错误会通知gulp是继续还是结束

关于您的具体示例,在任务
copy_sass
中,您多次调用
copyPath
。复制已开始,但方法会立即返回,而无需等待完成。之后,调用
done
回调,告诉Gulp任务已完成

为了确保任务完成,您需要将每一条流返回到Gulp。在您的示例中,您可以为每个复制操作创建一个单独的任务,并通过
series()
甚至
parallel()
聚合它们:


一个单独的问题-在
css\u build
中,您正在执行
return
,然后调用
done()
-这将是无法访问的代码,因为
return
停止函数的进一步执行。另一个问题-在
css\u build
中,您正在执行
return
,然后调用
done()
-这将是无法访问的代码,因为
return
会停止函数的进一步执行。
function copyMixin() {
    return src('...').pipe(dest(...))
}

function copySettings() {
    return src('...').pipe(dest(...))
}

// ...

var copySass = parallel(copyMixin, copySettings, ...)