Gulpjs ждет асинхронной функции, прежде чем продолжить

Я разрезал gulpfile.js на несколько файлов. Моя цель — поделиться данными с различными задачами. И я использую систему Windows, gulp 5 и конфигурацию «type»: «module».

Структура файла приведена ниже:

gulpfile.js
tasks/clean.js
tasks/deploy_data.js
data/path.js
data/other.js

gulpfile.js

import gulp from 'gulp';
import clean from './tasks/clean.js';
import deploy_data from './data/deploy_data.js';

global.data = {}; // share data with all tasks.

function deploy_at_start() {
  gulp.series(deploy_data);
}

deploy_at_start(); // I hope that deploy_data will be executed before any task I debug, because each task needs to use the contents of data.

console.info(data); // {} Blank, obviously deploy_data has not been completed yet, I want the code below to be executed only after it completes.

export {
  clean,
  // alot of other tasks
};

./задачи/clean.js

function clean(cb) {
  console.info(data.path.src); // I need to get some information from data, such as the path I want to delete.
  cb();
}

export default clean;

Дело в том, что

данные/path.js

const path = {
  src: './folder/*',
};

export default path;

задачи/deploy_data.js

import path from 'node:path';
import { pathToFileURL } from 'node:url';

async function deploy_data(cb) {
  const dir = path.join(process.cwd(), 'data');
  const files = fs
.readdirSync(dir, { withFileTypes: true }).filter((item) => item.isFile())
.map((item) => item.name); // I have a lot of data files, so this is the easier way to get all the data

  for (const file of files) {
    data[path.parse(file).name] = (await import(pathToFileURL(path.join(dir, file)).href)).default;
  }

  cb();
}

export default deploy_data;

Когда я выполняю gulp clean, я не могу получить информацию data.path. Я думаю, это может быть потому, что deploy_data асинхронен и что-то пошло не так.

Из терминала я вижу, что deploy_data завершает свою работу после завершения очистки, поэтому данные пусты.

Я понимаю, что могу использовать gulp.series для выполнения развертывания_данных перед очисткой, но у меня огромный объем данных. Я думаю, что смогу достичь цели, выполнив развертывание_data один раз в начале gulpfile.js, аналогично текущему методу.

В приведенном выше случае есть ли способ выполнить развертывание_data перед выполнением любой задачи gulp (экспортированной задачи) и дождаться ее завершения перед выполнением другого кода?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто добавьте верхний уровень await:

await deploy_at_start();

и не забудьте вернуться из deploy_at_start, чтобы await подождал gulp.series(), чтобы закончить:

function deploy_at_start() {
  return gulp.series(deploy_data);
}

Я попробовал это сделать, прежде чем задать вопрос, но это не помогло и вернулось только {}. Наконец, я обнаружил, что это удалось, если cb() в Deploy_data было изменено на cb. Ваш ответ правильный, но с моим кодом что-то не так. Это очень странно, знаете причину? Почему cb влияет на результаты?

aboutjquery 03.05.2024 15:51

@aboutjquery я добавил дополнительную информацию к ответу

Alexander Nenashev 03.05.2024 15:53

Я протестировал предоставленный вами новый метод, но он не сработал, но ваш предыдущий ответ сработал. верхний уровень await Deploy_data может генерировать данные до того, как я выполню gulp clean, но я хочу спросить немного больше, хочу ли я поддерживать const Deploy_at_start = gulp.series (deploy_data, // другая задача развертывания); формат, потому что в будущем будет больше задач, которые необходимо будет выполнить перед выполнением других задач...

aboutjquery 05.05.2024 15:55

Если я хочу запустить какую-либо задачу, например, gulp clean, метод Deploy_at_start() сначала сгенерирует данные. Теперь у меня возникла проблема. Например, при выполнении gulp clean последовательность: Начало «deploy_data», Начало «очистки», Завершение «Очистка», Завершение «deploy_data». Я ожидал сначала закончить depoy_data, а затем приступить к очистке. Два дня пробовал, причину не нашел. , или мне стоит открыть новую тему.

aboutjquery 05.05.2024 15:55

Другие вопросы по теме