2016-07-13 9 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')); 

Согласно StackTrace, мешающая линия

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

внутри задачи watch. Задача compile-ts работает и возвращает поток, который должен быть достаточным для завершения сигнала. Но почему я все равно получаю ошибку?

Это [email protected].

EDIT:

Изменение 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-ts и watch-assets оба дают мне это сообщение об ошибке. Любой из них возвращает поток, насколько я могу судить.

+0

Возможного дубликат [ошибки Глотка: Следующие задачи не завершены: Вы забыли сигнализировать о завершении асинхронного?] (HTTP : //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 заканчивается через 4 мс.

Запуск часов, однако не автоматически запускает выполнение функции слушателя. Сначала вам нужно будет изменить один из просматриваемых файлов. В качестве альтернативы вы можете передать ignoreInitial option в gulp.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 не был определен, и сообщение об ошибке вводило в заблуждение. –

 Смежные вопросы

  • Нет связанных вопросов^_^