簡體   English   中英

Vinyl-fs(gulp文件流)在觸發回調或promise之前未完成.dest寫入

[英]vinyl-fs (gulp file stream) not finishing .dest write before firing callback or promise

令人沮喪地嘗試在啟動將目標文件夾的副本上載到S3存儲桶的代碼之前,先獲取Vinyl-fs(gulpfs)流以完成所有.dest文件的寫入。 該復制操作會丟失流尚未寫入的目錄。

問題是vinly-fs如何處理回調/承諾(是嗎?)。

我已經整理了一些測試代碼進行實驗,但是當運行該代碼時,即使在.dest命令后強制流在啟動promise解析之前等待5秒鍾之后,promise也會立即被解析(在寫入開始之后?)。 我的解決功能當前會觸發,然后在5秒鍾后返回提示。 完全陷於此。 我不想沒有Vinyl-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並返回promise並將我的上載作為單獨的gulp任務執行。 我目前將gulp.tasks最小化為cli啟動的任務。 最終,像運行此代碼一樣,只需使用哇“節點測試”代替,並一起刪除全局gulp依賴項和gulpfile.js。 Vinyl-fs是一個很棒的模塊!但是我決定最好不要購買Gulp / Grunt / Brunch / Jake的東西。

好像你想要的

.on('finish', resolve)

而不是立即調用resolve() 另外,可讀流不會發出finish事件 ,而會發出end事件 ,因此您必須使用

.on('end', resolve)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM