javascript - Vinyl-fs(gulp 文件流)在触发回调或 promise 之前未完成 .dest 写入

标签 javascript node.js gulp promise node.js-stream

令人沮丧的是,在启动代码将目标文件夹的副本上传到 S3 存储桶之前,尝试获取 Vinyl-fs (gulpfs) 流来完成所有 .dest 文件的写入。该复制操作始终丢失流尚未写入的目录。

问题在于 vinly-fs 如何处理回调/ promise (是吗?)。

我已经整理了一些测试代码来进行实验,但是当该代码运行时, promise 会立即得到解决(在写入开始之后?),即使我强制流在 .dest 命令之后等待 5 秒,然后再触发 promise 解决。我的解析函数当前已触发,5 秒后我又回到提示符。完全卡在这上面了。我不想没有乙烯基文件系统,但无论我尝试什么,它似乎都不能很好地发挥作用,我需要它作为一个序列工作(在上传之前写出所有文件)。

下面是我的测试代码。我设置了这个,这样您就可以轻松地将代码转储到文件中,设置一些源目录并自己尝试。我在 stackoverflow 上查看了 gulpjs 问题,其他一些人也遇到了同样的问题,但我没有看到明确的答案/解决方案。

测试.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 并返回 promise 并将我的上传作为单独的 gulp 任务触发。我目前将 gulp.tasks 最小化为 cli 启动的任务。最终,就像运行此代码一样,只需使用 wow“node test” 代替,并一起删除全局 gulp 依赖项和 gulpfile.js 。 Vinyl-fs 是一个很棒的模块!但我决定最好不要购买 Gulp/Grunt/Brunch/Jake 的东西。

最佳答案

看起来就像你想要的

.on('finish', resolve)

而不是立即调用resolve()。此外,可读流不会发出 finish event ,它们发出 end event ,所以你必须使用

.on('end', resolve)

关于javascript - Vinyl-fs(gulp 文件流)在触发回调或 promise 之前未完成 .dest 写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303084/

相关文章:

javascript - Angular 和 Ionic 4 - 等待和异步未按预期工作

javascript - 动画到另一种背景颜色,然后再返回

javascript - GWT:调用外部 JavaScript 库 (sjcl) 方法

javascript - 类型错误 : Request path contains unescaped characters

node.js - 'npm install -g xxx' 安装到的目的地是什么?

gulp-imagemin:无法加载默认插件 xxx

javascript - 如果列表 LI 具有使用 jquery 的 UL,则更改 div 的高度对我不起作用

javascript - node-imagemagick 与 node-gm 相比如何?

typescript - Browserify + typescript

javascript - gulp-clean-css 不能在一个特定的目录中工作?