2016-07-13 37 views
0

我想不通爲什麼我得到信號異步完成的錯誤,雖然我回到流

Did you forget to signal async completion?

這裏是我的設置:

gulp.task('compile-ts',() => { 
    return tsProject.src(config.files.src.ts) 
     .pipe($.tap((file, t) => { 
      logVerbose('Compiling "' + file.path + "'"); 
     })) 
     .pipe($.sourcemaps.init()) 
     .pipe($.typescript(tsProject)) 
     .pipe($.sourcemaps.write('./')) 
     .pipe($.chmod(755)) 
     .pipe(gulp.dest(config.dist)); 
}); 

gulp.task('copy-assets',() => { 
    return gulp.src(config.files.src.css_html_js, { base: config.src }) 
     .pipe($.tap((file, t) => { 
      logVerbose('Copying "' + getFileName(file.path) + "'"); 
     })) 
     .pipe($.chmod(755)) 
     .pipe(gulp.dest(config.dist)); 
}); 

gulp.task('browser-sync', (done) => { 
    browserSync.init({ 
     "port": 3000, 
     "startPath": "dist/index.html", 
     "browser": "chrome", 
     "logLevel": "silent", 
     "server": { 
      "middleware": { 
       "0": null 
      } 
     } 
    }, done); 
    process.on('exit',() => { 
     browserSync.exit(); 
    }); 
}) 

gulp.task('watch', gulp.parallel(() => { 
    gulp.watch(config.files.ts, gulp.series('compile-ts')); 
},() => { 
    gulp.watch(config.files.css_html_js, gulp.series('copy-assets')); 
})); 

gulp.task('serve-dist', gulp.parallel('watch', 'browser-sync')); 

根據堆棧跟蹤,違規行

gulp.watch(config.files.ts, gulp.series('compile-ts')); 

裏面的watch任務。任務compile-ts正在工作,它返回一個流,這應該足以表示完成。但是,爲什麼我會收到錯誤呢?

這是[email protected]

編輯:

改變watch任務

gulp.task('watch', (done) => { 
    gulp.watch(config.files.css_html_js, gulp.series('copy-assets')); 
    gulp.watch(config.files.ts, gulp.series('compile-ts')); 
    done(); 
}); 

我沒有得到任何錯誤了,但是任務是在所有4毫秒內完成,什麼都不做。如果我刪除了done部件,我又得到相同的錯誤。

EDIT2:我分裂的任務了一些更能夠找出問題,

gulp.task('watch-ts',() => { 
    return gulp.watch(config.files.ts, gulp.series('compile-ts')); 
}); 

gulp.task('watch-assets',() => { 
    return gulp.watch(config.files.css_html_js, gulp.series('copy-assets')); 
}); 

gulp.task('watch', gulp.parallel('watch-ts', 'watch-assets')); 

現在watch-tswatch-assets既給我的錯誤信息。據我所知,其中任何一個都會返回一個流。

+0

的可能的複製[咕嘟咕嘟錯誤:下面的任務沒有完成:你忘了信號異步完成?](HTTP ://www.stackoverflow.com/questions/36897877/gulp-error-the-following-tasks-did-not-complete-did-you-forget-to-signal-async) –

+0

也不'tsProject.src() '返回一個流? ['gulp.watch()'](https://github.com/gulpjs/gulp/blob/4.0/docs/API.md#gulpwatchglobs-opts-fn)需要一個字符串或一個字符串數組。 –

+0

更正。不會改變結果,並在發佈我的問題之前檢查了建議的答案 - 在我看來 - 我正在返回一個流(=您的答案項目1)。 –

回答

1

總是需要信號異步完成函數組成一個任務。不只是那些異步的。不僅僅是那些使用流。如果你沒有在一個函數中返回一個流,你仍然需要以某種方式發信號通知異常(通常通過調用回調)。

所以,你的第一個編輯已經正確:

gulp.task('watch', (done) => { 
    gulp.watch(config.files.css_html_js, gulp.series('copy-assets')); 
    gulp.watch(config.files.ts, gulp.series('compile-ts')); 
    done(); 
}); 

調用回調這裏可以確保一飲而盡知道你watch任務已圓滿完成。在這種情況下,「成功完成」意味着您的任務已啓動兩個手錶。即使watch作業完成後,兩隻手表仍將繼續運行。所以watch任務在4ms之後終止這一事實沒有任何問題。

但是啓動手錶而不是會自動觸發監聽功能的執行。您必須先修改其中一個觀看的文件。另外,您可以通過ignoreInitial optiongulp.watch()將觸發手錶時,第一次啓動時:

gulp.task('watch', (done) => { 
    gulp.watch(config.files.css_html_js, {ignoreInitial:false}, gulp.series('copy-assets')); 
    gulp.watch(config.files.ts, {ignoreInitial:false}, gulp.series('compile-ts')); 
    done(); 
}); 
+0

感謝您指出了斯文,它現在正在工作。我說它什麼也沒做,因爲它實際上什麼也沒做。如果仔細觀察,您會看到例如'compile-ts'任務引用一個glob var'config.files.src.ts',將它與手錶中的glob var進行比較,以及 - 雷擊。所以實際上glob是未定義的,錯誤信息是誤導性的。 –