Я разрезал 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 (экспортированной задачи) и дождаться ее завершения перед выполнением другого кода?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Просто добавьте верхний уровень await:
await deploy_at_start();
и не забудьте вернуться из deploy_at_start, чтобы await подождал gulp.series(), чтобы закончить:
function deploy_at_start() {
return gulp.series(deploy_data);
}
@aboutjquery я добавил дополнительную информацию к ответу
Я протестировал предоставленный вами новый метод, но он не сработал, но ваш предыдущий ответ сработал. верхний уровень await Deploy_data может генерировать данные до того, как я выполню gulp clean, но я хочу спросить немного больше, хочу ли я поддерживать const Deploy_at_start = gulp.series (deploy_data, // другая задача развертывания); формат, потому что в будущем будет больше задач, которые необходимо будет выполнить перед выполнением других задач...
Если я хочу запустить какую-либо задачу, например, gulp clean, метод Deploy_at_start() сначала сгенерирует данные. Теперь у меня возникла проблема. Например, при выполнении gulp clean последовательность: Начало «deploy_data», Начало «очистки», Завершение «Очистка», Завершение «deploy_data». Я ожидал сначала закончить depoy_data, а затем приступить к очистке. Два дня пробовал, причину не нашел. , или мне стоит открыть новую тему.
Я попробовал это сделать, прежде чем задать вопрос, но это не помогло и вернулось только {}. Наконец, я обнаружил, что это удалось, если cb() в Deploy_data было изменено на cb. Ваш ответ правильный, но с моим кодом что-то не так. Это очень странно, знаете причину? Почему cb влияет на результаты?