【问题标题】:vinyl-fs (gulp file stream) not finishing .dest write before firing callback or promise在触发回调或承诺之前,vinyl-fs(gulp 文件流)未完成 .dest 写入
【发布时间】:2016-03-22 01:28:56
【问题描述】:

令人沮丧的是,在启动代码以将目标文件夹的副本上传到 S3 存储桶之前,尝试让乙烯基 fs (gulpfs) 流完成写入所有 .dest 文件。该复制操作一直缺少流尚未写入的目录。

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

我已经整理了一些测试代码来进行实验,但是当该代码运行时,即使我在 .dest 命令之后强制流等待 5 秒,然后再触发承诺解决。我的解析功能当前触发,然后 5 秒后我回到我的提示。完全卡在了这一点上。我不想没有乙烯基-fs,但无论我尝试什么,它似乎都不能很好地播放,我需要它作为一个序列工作(在上传之前写出所有文件)。

下面是我的测试代码。我进行了设置,以便您可以轻松地将代码转储到文件中,设置一些源目录并自己尝试。我查看了 gulpjs 问题和 stackoverflow 以及其他一些问题,但我没有看到明确的答案/解决方案。

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

【问题讨论】:

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


【解决方案1】:

好像你想要的

.on('finish', resolve)

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

.on('end', resolve)

【讨论】:

  • 试试吧。如果这样做,则永远不会调用解析函数“bar”。 5 秒后它会返回提示。
  • @DKebler:这只是表明finish 永远不会被解雇。并不是说立即解决承诺是要走的路。
  • 是的@Bergi,你是对的。所以我尝试了“结束”.on('end', resolve)宾果游戏!那么你或其他人能解释一下结束和结束之间的区别吗?因此,如果您将帖子更改为“结束”,我将投票并使其成为答案。
  • @DKebler:我刚刚做了编辑 :-) 另见stackoverflow.com/q/28334610/1048572
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2016-08-11
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多