2010-05-29 4 views
2

У меня проблема. Кажется, я не могу обернуть голову. Я хочу написать общую функцию javascript, которая примет переменную и обратный вызов и продолжит выполнение до тех пор, пока эта переменная не станет чем-то иным, чем false.Обратный вызов Javascript, когда переменная установлена ​​на X

Например, переменная SpeedFeed.user.sid является ложной до тех пор, пока в коде не произойдет что-то еще, но я не хочу выполнять конкретный обратный вызов до тех пор, пока он не будет установлен.

Вызов:

SpeedFeed.helper_ready(SpeedFeed.user.sid, function(){ 
    alert(SpeedFeed.user.sid); 
    // Run function that requires sid to be set. 
}); 

Функция:

helper_ready: function(vtrue, callback){ 
    if(vtrue != false){ 
    callback(); 
    } else { 
    setTimeout(function(){ 
     SpeedFeed.helper_ready(vtrue, callback); 
    }, SpeedFeed.apiCheckTime); 
    } 
} 

вопрос я сузили его до, кажется, что поскольку в SetTimeout я называю vtrue вместо фактического SpeedFeed. user.sid, он будет всегда установлен на false. Я понимаю, что каждый раз могу написать определенную функцию, которая просто оценивает SpeedFeed.user.sid, но я хотел бы иметь общий метод, который я мог бы использовать во всем приложении.

Спасибо за любую проницательность :)

+0

Есть функция 'SpeedFeed.user.sid', или нет? Я предположил, что это потому, что вы написали * «Я называю vtrue вместо фактического SpeedFeed.user.sid» *. Потому что вы называете это, я полагаю, что это функция. Я ошибаюсь? – user113716

ответ

0

перевалу helper_ready три параметра: source_object, object`s_property, обратного вызова

, а затем проверить состояние object`s имущества. в вашем случае это будет

SpeedFeed.helper_ready(SpeedFeed.user, "sid", function(){ 
    alert(SpeedFeed.user.sid); 
    // Run function that requires sid to be set. 
}); 

для глобального свойства:

SpeedFeed.helper_ready(window, "sid", function(){ 
    alert(windwo.sid); 
    // Run function that requires sid to be set. 
}); 
1

Вы проходящие в текущем значении vtrue для setTimeout который затем повторяет процесс, поэтому параметр vtrue всегда одинаков (vtrue является неизменным).

Вместо того, чтобы писать обратный вызов, как функцию, которая проверяет, когда определенное значение, правда, почему бы не сделать-акцессоры функции, которые могут вызывать callback() или просто позвонить callback() непосредственно, когда vtrue будет true? Коду будет намного проще следовать этому пути, и вам не понадобятся такие хаки, как setTimeout.

Существует несколько решений этой проблемы, которые не требуют обратного вызова. Одним из обычных подходов было бы использовать setters and getters вместо назначений.

1

В дополнение к ответу @Trey, так как я также думал о setter и getter. В дополнение к настройке и получению функциональности я бы предложил добавить что-то вроде registerListener и unregisterListener, которые будут регистрировать слушателей, чтобы следить за состоянием вашей переменной. И тогда каждый раз, когда геттер называется итерацией по всем слушателям и сообщает им об обновленном значении или просто передает это значение им.

0

Вместо того чтобы использовать тайм-аут setInterval. See this question. Это похоже на то, что вы пытаетесь сделать.

Смежные вопросы