vinyl-fs(gulp 文件流)在触发回调或承诺之前未完成 .dest 写入
vinyl-fs (gulp file stream) not finishing .dest write before firing callback or promise
令人沮丧地尝试获取 vinyl-fs (gulpfs) 流以在启动代码以将目标文件夹的副本上传到 S3 存储桶之前完成所有 .dest 文件的写入。该复制操作一直缺少流尚未写入的目录。
问题是 vinly-fs 如何与 callbacks/promises 一起玩(是吗?)。
我已经将一些测试代码放在一起进行实验,但是当该代码是 运行 时,承诺会立即解决(写入开始后?),即使我强制流在触发 promise 解决之前的 .dest 命令。我的解析功能当前触发,然后 5 秒后我回到我的提示。完全坚持这一点。我不想在没有 vinyl-fs 的情况下生活,但无论我尝试什么,它似乎都不能很好地发挥作用,我需要它作为一个序列工作(在上传之前写出所有文件)。
下面是我的测试代码。我设置它是为了让您可以轻松地将代码转储到一个文件中,设置一些源目录并自己尝试。我查看了 gulpjs 问题和 Whosebug,其他一些人也有同样的问题,但我没有看到明确的 answer/solution。
test.js
var source = './builds/**/*.*';
var p = foo(source);
p.then( bar, oopsBar );
//
// vinyl-fs based module task
//
function foo(src) {
var fs = require('vinyl-fs');
var wait = require('gulp-wait')
done = new Promise( function(resolve,reject){
fs.src(src)
.pipe(fs.dest('./temp'))
.pipe(wait(5000))
.on('finish',resolve());
});
// return a promise
return done;
}
function bar() {
console.log('Now uploading to S3 bucket');
}
function oopsBar() {
console.log('Something went wrong');
}
顺便说一句,您可能想知道为什么我不使用 gulp.task 和 return 承诺并将我的上传作为单独的 gulp 任务触发。我目前将我的 gulp.tasks 最小化为 cli 启动的任务。最终像 运行ning 这段代码只是使用 wow "node test" 代替并删除全局 gulp 依赖项和 gulpfile.js 一起。 Vinyl-fs 是一个很棒的模块!但我决定最好不要购买 Gulp/Grunt/Brunch/Jake 东西。
看来你想要
.on('finish', resolve)
而不是立即调用 resolve()
。此外,可读流不会发出 finish
event, they emit an end
event,因此您必须使用
.on('end', resolve)
令人沮丧地尝试获取 vinyl-fs (gulpfs) 流以在启动代码以将目标文件夹的副本上传到 S3 存储桶之前完成所有 .dest 文件的写入。该复制操作一直缺少流尚未写入的目录。
问题是 vinly-fs 如何与 callbacks/promises 一起玩(是吗?)。
我已经将一些测试代码放在一起进行实验,但是当该代码是 运行 时,承诺会立即解决(写入开始后?),即使我强制流在触发 promise 解决之前的 .dest 命令。我的解析功能当前触发,然后 5 秒后我回到我的提示。完全坚持这一点。我不想在没有 vinyl-fs 的情况下生活,但无论我尝试什么,它似乎都不能很好地发挥作用,我需要它作为一个序列工作(在上传之前写出所有文件)。
下面是我的测试代码。我设置它是为了让您可以轻松地将代码转储到一个文件中,设置一些源目录并自己尝试。我查看了 gulpjs 问题和 Whosebug,其他一些人也有同样的问题,但我没有看到明确的 answer/solution。
test.js
var source = './builds/**/*.*';
var p = foo(source);
p.then( bar, oopsBar );
//
// vinyl-fs based module task
//
function foo(src) {
var fs = require('vinyl-fs');
var wait = require('gulp-wait')
done = new Promise( function(resolve,reject){
fs.src(src)
.pipe(fs.dest('./temp'))
.pipe(wait(5000))
.on('finish',resolve());
});
// return a promise
return done;
}
function bar() {
console.log('Now uploading to S3 bucket');
}
function oopsBar() {
console.log('Something went wrong');
}
顺便说一句,您可能想知道为什么我不使用 gulp.task 和 return 承诺并将我的上传作为单独的 gulp 任务触发。我目前将我的 gulp.tasks 最小化为 cli 启动的任务。最终像 运行ning 这段代码只是使用 wow "node test" 代替并删除全局 gulp 依赖项和 gulpfile.js 一起。 Vinyl-fs 是一个很棒的模块!但我决定最好不要购买 Gulp/Grunt/Brunch/Jake 东西。
看来你想要
.on('finish', resolve)
而不是立即调用 resolve()
。此外,可读流不会发出 finish
event, they emit an end
event,因此您必须使用
.on('end', resolve)