Gulpjs 在继续之前等待异步函数

问题描述 投票:0回答:1

我将 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.log(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
};

./tasks/clean.js

function clean(cb) {
  console.log(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
在clean完成后完成了它的工作,这就是数据为空的原因。

我知道我可以在clean之前使用gulp.series执行deploy_data,但是我有大量数据。我想我可以通过在

gulpfile.js
开始时执行一次deploy_data来实现目标,类似于当前的方法。

在上述情况下,有没有办法让我在执行任何gulp任务(已导出的任务)之前执行deploy_data并等待其完成后再执行其他代码?

javascript node.js gulp
1个回答
1
投票

只需添加一个顶级

await
:

await deploy_at_start();

并且不要忘记从

deploy_at_start
返回,这样
await
会等待
gulp.series()
完成:

function deploy_at_start() {
  return gulp.series(deploy_data);
}
© www.soinside.com 2019 - 2024. All rights reserved.