Задать вопрос
fandorin_official
@fandorin_official
Герой серии исторических детективов.

Как будет выглядеть callback функция?

Всем добра.
Подскажите пожалуйста, верно ли я написал callback?
function start() {
        //...тут какой-то код
        checkResult(read);
    }

    function checkResult(last_read, callback) {
        setTimeout(function() {
            var result = getRead();
            if (last_read < result) {
                //...тут какой-то код
                //первый блок
            } else if (last_read > result) {
                // ...тут какой-то код
                //второй блок
            } else {
                 //третий блок
                checkResult(last_read);
            }
        }, 1000);
        callback.call(start());
    }


То есть, у нас сперва выполняется функция start. После нее checkResult. Порой, изменения на странице происходят долго и функция checkResult на немного крутится по третьему блоку пока не увидит изменений в чате. После того, как функция checkResult требуется вызвать снова функцию start.
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Средний 3 комментария
Решения вопроса 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
Задача:
есть изменяющаяся во времени среда, нужно запустить асинхронный процесс, который будет периодически проверять некоторое условие и, если оно выполняется, единожды вызовет функцию и завершится.
// условие, когда нужно исполнить функцию и завершить процесс
function readIsOK(read) {
  return read != last_read;
}

// какие-то осмысленные действия, когда условие удовлетворяется
function doSomething(result) {
  if (last_read < result) {
        //...тут какой-то код
  } else if (last_read > result) {
        // ...тут какой-то код
  }
}

// функция, которая запускает процесс
function start() {
  // функция, которая ежесекундно проверяет условие
  // если условие выполняется, делает полезное действие
  // иначе процесс продолжается до следующего вызова checkRead
  function checkResult() {
    var result = getRead();
    if(readIsOK(result)) doSomething(result);
    setTimeout(checkResult, 1000);
  }
  // запускаем первую итерацию
  checkResult();
}

start();

Этот код принципиально ничем не отличается от Вашего.
Что мы можем хотеть сделать? Абстрагироваться от doSomething и last_read. На данный момент они являются внешними параметрами.
Абстракция от doSomething и будет колбеком, который Вы желаете.
// условие, когда нужно исполнить функцию и завершить процесс
function readIsOK(read) {
  return read != last_read;
}

// какие-то осмысленные действия, когда условие удовлетворяется
function doSomething(result) {
  if (last_read < result) {
        //...тут какой-то код
  } else if (last_read > result) {
        // ...тут какой-то код
  }
}

// функция, которая запускает процесс
function start(callback) {
  // функция, которая ежесекундно проверяет условие
  // если условие выполняется, делает полезное действие
  // иначе процесс продолжается до следующего вызова checkRead
  function checkResult() {
    var result = getRead();
    if(readIsOK(result)) callback(result);
    setTimeout(checkResult, 1000);
  }
  // запускаем первую итерацию
  checkResult();
}

start(doSomething);

Теперь можно сделать, например,
start(() => start(() => alert("hi!")));
Так после окончания первого процесса запустится второй, после окончания которого будет сообщение.

Важный момент: Вам, вероятно, захочется после каждого процесса запускать следующий, используя вместо last_read значение предыдущего result. Для этого необходимо абстрагироваться от last_read. Передача между двумя процессами уже реализована.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы