Задача:
есть изменяющаяся во времени среда, нужно запустить асинхронный процесс, который будет периодически проверять некоторое условие и, если оно выполняется, единожды вызовет функцию и завершится.
// условие, когда нужно исполнить функцию и завершить процесс
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. Передача между двумя процессами уже реализована.