Как запустить несколько функций глотка последовательно? - PullRequest
0 голосов
/ 13 ноября 2018

Для регистрации задания gulp я использую следующий код:

gulp.task('test-module', function() {
    return testModule(__dirname);
});

Это testModule функция:

export function testModule(modulePath) {
    let task1 = buildModule(modulePath, true);
    let task2 = buildTestModule(modulePath);
    let task3 = runModuleTests(modulePath);
    return [task1, task2, task1];
}

Проблема с этим кодом заключается в том, что runModuleTests(modulePath) называется ДО, buildModule(modulePath, true) и buildTestModule(modulePath) генерирует файлы. Таким образом, при выполнении runModuleTests(modulePath) нет файлов для тестирования и файлов с тестами.

Я пробовал также

import gulpall from 'gulp-all';

export function testModule(modulePath) {
    return gulpall(
            buildModule(modulePath, true),
            buildTestModule(modulePath),
            runModuleTests(modulePath)
    );
}

но результат тот же. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Ваши функции, особенно 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

Так что сделайте так, чтобы ваши функции возвращали обещания, а затем ожидали их результата. Это гарантирует, что функции вернутся в правильном порядке.

0 голосов
/ 13 ноября 2018

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

Пример:

gulp.task('after', ['before1', 'before2', ...], function() {

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...