我试图运行一个文件名列表,移动文件并压缩它们,然后在gulp中删除文件。我一直遇到这样的问题:下一个任务在上一个任务完成之前就开始了。
function moveFiles(cb) {
folders.forEach(function(item,index){
var _tmp = '../final_files/' + item;
return Promise.all([
new Promise(function(resolve, reject) {
gulp.src('../' + item + '/**/*').pipe(gulp.dest(_tmp))
.on('end', resolve)
}),
new Promise(function(resolve, reject) {
gulp.src('../master/assets/**/*.*').pipe(gulp.dest(_tmp + '/assets/'))
.on('end', resolve)
}),
new Promise(function(resolve, reject) {
gulp.src([_tmp + '/**', _tmp + '/style/**', _tmp + '/js/**'], {base: "./"})
.pipe(replace('../master/assets', 'assets'))
.pipe(gulp.dest('.'))
.on('end', resolve)
}),
new Promise(function(resolve, reject) {
return gulp.src(_tmp + '/**/*.*')
.pipe(zip(item + '.zip'))
.pipe(gulp.dest( '../final_files/'))
.on('end', resolve)
}),
]).then(function () {
return gulp.src(_tmp, {read: false}).pipe(clean({force: true}));
});
});
}
我试着把它分解成任务,但我不知道如何把参数传给任务,或者让任务等待它完成。如果能得到任何指导,我将非常感激。
尊敬的各位
这是我想出的办法。
function moveFiles(cb) {
const files = folders.map( function (item) {
let _tmp = '../final_files/' + item;
let _mv = async () => {
return promisifyStream( gulp.src('../' + item + '/**/*').pipe(gulp.dest(_tmp)) );
};
let _mv_assets = async () => {
return promisifyStream( gulp.src('../master/assets/**/*.*').pipe(gulp.dest(_tmp + '/assets/')) );
};
let _replce = async () => {
return promisifyStream( gulp.src([_tmp + '/**', _tmp + '/style/**', _tmp + '/js/**'], {base: "./"}).pipe(replace('../master/assets', 'assets')).pipe(gulp.dest('.')) );
};
let _zip = async () => {
return promisifyStream( gulp.src(_tmp + '/**/*.*').pipe(zip(item + '.zip')).pipe(gulp.dest( '../final_files/')) );
};
let _clean = async () => {
return promisifyStream( gulp.src(_tmp, {read: false}).pipe(clean({force: true})) );
};
let tsk = series(_mv, _mv_assets, _replce, _zip, _clean);
tsk();
});
cb();
}
function promisifyStream(stream) {
return new Promise( res => stream.on('end',res));
}
虽然_clean没有完成