Вызов тайм-аут с обратным вызовом - PullRequest
0 голосов
/ 14 ноября 2018
function fn1() {
  setTimeout(() => {
    console.log('hello');
  }, 5000);
}

function fn2() {
  setTimeout(() => {
    console.log('goodbye');
  }, 3000);
}

a) Как изменить вышеуказанные функции с помощью обратного вызова, чтобы он мог сначала печатать «привет», а затем «до свидания». б) я хотел затем напечатать «до свидания», затем «привет», и после этого просто хотел напечатать «завершено». Как это сделать также через обратный вызов.

Ответы [ 2 ]

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

Обратите внимание, что когда вы передаете обратный вызов в другую функцию, вы передаете только ссылку на функцию (без ее выполнения, то есть без скобок ()). И по возвращении мы проверяем, была ли передана ссылка на функцию (лучше проверить с помощью метода lodash или _ isFunction, потому что это может вызвать ошибку, если foo не является функцией)

const fn1 = (foo = false) => {
  setTimeout(console.log('goodbye'), 300);

  return foo && foo()
}

const fn2 = (foo = false) => {
  setTimeout( console.log('hello'), 500);
  
  return foo && foo()
}


fn1(fn2)
fn2(fn1)
0 голосов
/ 14 ноября 2018

Я не уверен, что правильно понял ваш вопрос, но это больше того, что вы ищете?

    function fn1(callback) {
      setTimeout(() => {
        console.log('hello');
      }, 2999);
      callback();
    }

    function fn2() {
      setTimeout(() => {
        console.log('goodbye');
      }, 3000);
    }

    fn1(function() {
        fn2();
         setTimeout(function() {
            console.log("completed");
         }, 3001)
    });

если это так, то вы должны правильно установить значение тайм-аута, если вы хотите, чтобы они печатались в таком порядке, помните, что значения также должны быть последовательными, в противном случае вам придется установить новые тайм-ауты для fn2и следующее console.log('Completed'), вот так:

    function fn1(callback) {
      setTimeout(() => {
        console.log('hello');
      }, 5000);
      callback();
    }

    function fn2() {
      setTimeout(() => {
        console.log('goodbye');
      }, 3000);
    }

    fn1(function() { // callback
        setTimeout(function() { // timeout so fn2 fires once fn1 delay is finished
            fn2();
            setTimeout(function() {
                // add your console.log("completed"); or third function
                // here so it fires right after fn2
             }, 3001); // 3000 fn2 timeout + 1ms more so it fires right after
        }, 2001); // the difference between fn1 timeout - fn2 timeout + 1ms so it fires right after
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...