JavaScript Последовательное выполнение функции для нескольких функций - PullRequest
0 голосов
/ 22 февраля 2020

Я (первый раз JavaScript пользователь со вчерашнего дня) смог заставить JavaScript запускать функции в порядке последовательного выполнения (см. Код ниже) (кредит @CertainPerformance). Мне нужно использовать fastFunction в нескольких slowFunctions. Текущее решение не кажется мне DRY (не повторяйтесь), и в то же время оно не гарантирует порядок выполнения slowFunction1, а затем slowFunction2. Каково DRY решение этой проблемы в JavaScript? Могу ли я заставить JavaScript всегда работать в последовательном режиме при какой-то конфигурации? Использование вложенных обратных вызовов не кажется мне самым разумным решением.

function fastFunction(message) {
  console.log(message);
}

function slowFunction1(callback, message) {
  setTimeout(() => {
    console.log('slowFunction1!');
    callback(message);
  }, 10000);
}

function slowFunction2(callback, message) {
  setTimeout(() => {
    console.log('slowFunction2!');
    callback(message);
  }, 1000);
}

slowFunction1(fastFunction, 'fast_Function');
slowFunction2(fastFunction, 'fast_Function');

1 Ответ

1 голос
/ 22 февраля 2020

С помощью async / await вы можете упорядочивать асинхронные задачи следующим образом:

// Very handy utility function to get a promise that resolves after a given delay
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

function fastFunction(message) {
  console.log(message);
}

async function slowFunction1(callback, message) {
  console.log('slowFunction1!');
  await delay(2000); // two seconds
  callback(message);
}

async function slowFunction2(callback, message) {
  console.log('slowFunction2!');
  await delay(1000); // one second
  callback(message);
}

(async function() {
    // Put all your logic here, and await promises...
    await slowFunction1(fastFunction, 'fast_Function');
    await slowFunction2(fastFunction, 'fast_Function');
})(); // execute immediately

Теперь у вас будут задержки, происходящие одна за другой, поэтому 2 + 1 = 3 секунды в (приблизительном) общем времени выполнения.

Это больше всего имитирует то, что вы использовали в качестве шаблона, но как только вы используете обещания, вам больше не нужен шаблон обратного вызова, и вы можете сделать это следующим образом:

// Very handy utility function to get a promise that resolves after a given delay
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));

function fastFunction(message) {
  console.log(message);
}

(async function() {
  console.log('slow part 1');
  await delay(2000); // two seconds
  fastFunction('fast_function');
  console.log('slow part 2');
  await delay(1000); // one second
  fastFunction('fast_function');
})(); // execute immediately
...