@alexjc
вебмастер

Есть ли событие появления переменной?

Кратко и понятно: хочу чтобы сработала моя функция после того, как переменная var получит значение true. Есть ли решение на javascript или jquery, кроме как проверять с интервалом переменную var? Запустить функцию после присвоения значения переменной не вариант, т.к. на этот момент функции может ещё не существовать, или наоборот, функция появится раньше переменной (асинхронные скрипты).
  • Вопрос задан
  • 274 просмотра
Пригласить эксперта
Ответы на вопрос 3
Ivanq
@Ivanq
Знаю php, js, html, css
Люди, что вы зациклились на jQuery?

Можно ведь сделать проще. Предположу, что у вас что-то типа того:
var done = false;
var result = "";
obj.ondone = function(e) { // здесь любое событие
    done = true;
    result = e.result;
    // хотим отловить этот момент
};


Теперь смотрите: если переменная объявлена через var, то только так:
var func = function(callback) {
    obj.ondone = function(e) {
        callback(e.result);
    };
};
func(function(result) {
    alert(result);
});

Можно еще промисы прикрутить и т. п., но Вы меня поняли.

Если переменная глобальная, лучше использовать вариант выше, но в крайнем случае так:
_done = false;
_result = "";

function func() {
    obj.ondone = function(e) {
        _done = true;
        _result = e.result;
    };
}

setTimeout(function f() {
    if(_done) {
        // готово
    } else {
        setTimeout(f, 500); // каждые 0.5 с
    }
}, 500); // каждые 0.5 с
func();
Ответ написан
Комментировать
@alexjc Автор вопроса
вебмастер
спасибо, но блин я не смог понять как это может работать без settimeout(
У меня как-то не так. Есть функция, которая ждёт появления глобальной переменной, чтобы выполниться. Можно в примере показать ту часть кода, которая будет повторяться, а не завершится сразу, если переменная false?

UPD: не то, потому что ещё такой момент: Считывать переменную done нужно несколько раз, а код, который формирует переменную done должен выполниться только один раз.
Ответ написан
Комментировать
@alexeyproject
Вместо переменной заведите объект со свойством-аксесором
let obj = {
    _v: 0,
    get value() {
        console.log("I've been read. I'm", this._v);
        return this._v;
    },
    set value(v) {
        this._v = v;
        console.log("I've been written. I'm", this._v);
    }
}

obj.value = 12;   // I've been written. I'm 12
let v = obj.value;   // I've been read. I'm 12
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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