F
F
fandorin_official2018-01-17 19:43:47
JavaScript
fandorin_official, 2018-01-17 19:43:47

What will the callback function look like?

All good.
Can you please tell me if I wrote the callback correctly?

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());
    }

That is, we first execute the start function. After it, checkResult. Sometimes, changes on the page take a long time and the checkResult function does not spin around a bit in the third block until it sees changes in the chat. After the checkResult function is required to call the start function again.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
Y
youngmysteriouslight, 2018-01-17
@fandorin_official

Task:
there is a time-varying environment, you need to start an asynchronous process that will periodically check some condition and, if it is true, call the function once and exit.

// условие, когда нужно исполнить функцию и завершить процесс
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();

This code is fundamentally no different from yours.
What might we want to do? Abstract from doSomething and last_read. At the moment they are external parameters.
The abstraction from doSomething will be the callback you want.
// условие, когда нужно исполнить функцию и завершить процесс
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);

Now you can do, for example, So after the end of the first process, the second one will start, after which there will be a message. An important point: You will probably want to run the next one after each process, using the value of the previous result instead of last_read . For this, it is necessary to abstract from last_read. Transfer between two processes is already implemented.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question