Ваши функции, особенно buildModule
и buildTestModule
, делают внутри них что-то асинхронное. Так что runModuleTests
вызывается до того, как они закончат, как вы знаете. Я смоделировал это поведение с помощью кода ниже:
const gulp = require('gulp');
// gulp.task('test-module', function() {
gulp.task('default', function() {
return testModule(__dirname);
});
function testModule(modulePath) {
let task1 = buildModule(modulePath, true);
let task2 = buildTestModule(modulePath);
let task3 = runModuleTests(modulePath);
return [task1, task2, task1];
}
function buildModule (path) {
setTimeout(() => {
console.log("in buildModule, should be step 1");
}, 2000);
};
function buildTestModule (path) {
setTimeout(() => {
console.log("in buildTestModule, should be step 2");
}, 2000);
};
function runModuleTests (path) {
console.log("in runModuleTests, should be step 3");
};
Я задержал первые две функции, чтобы показать, что происходит, когда более ранние функции асинхронны. Результат:
in runModuleTests, should be step 3
in buildModule, should be step 1
in buildTestModule, , should be step 2
Один из способов исправить это - использовать async / await и обещания, если можете. так что попробуйте этот код:
gulp.task('test-module', function(done) {
testModule(__dirname);
done();
});
// function testModule(modulePath) {
async function testModule(modulePath) {
let task1 = await buildModule(modulePath, true);
let task2 = await buildTestModule(modulePath);
let task3 = await runModuleTests(modulePath);
return [task1, task2, task1];
}
function buildModule (path) {
return new Promise(resolve => {
setTimeout(() => {
resolve(console.log("in buildModule, should be step 1"));
}, 2000);
// put your functionality here without the setTimeout() call above
});
};
function buildTestModule (path) {
return new Promise(resolve => {
setTimeout(() => {
resolve(console.log("in buildTestModule, , should be step 2"));
}, 2000);
// put your functionality here without the setTimeout() call above
});
};
function runModuleTests (path) {
return new Promise(resolve => {
// put your gulp.src pipeline here
console.log("in runModuleTests, should be step 3");
});
};
Результаты:
in buildModule, should be step 1
in buildTestModule, , should be step 2
in runModuleTests, should be step 3
Так что сделайте так, чтобы ваши функции возвращали обещания, а затем ожидали их результата. Это гарантирует, что функции вернутся в правильном порядке.