Javascript 一个gulp函数如何知道它内部调用的函数已经完成?
我正在编写一个gulp任务,将sass文件复制到tmp文件夹中,然后创建cssJavascript 一个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
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, ...)