у меня есть обработчик события переплетены в $someEl
, который должен выполнять только тогда, когда oRes
заполняется данными, которые могут исходить от любого первичного источника (getData1()
) или источник резервного копирования (getData2()
). Данные запрашиваются из источника резервного копирования только в том случае, если основной источник не работает.
Если первичный источник не тайм-аут, тогда все работает; однако, когда вызывается функция резервного копирования getData2()
, dfd
никогда не разрешается, поэтому ничто никогда не регистрируется при нажатии на $someEl
. Я подозреваю, что он не работает, потому что объект Deferred в getData2()
перезаписывает переменную dfd
, на которую ссылается обработчик кликов $someEl
.
У меня такое чувство, что я не применяю отсрочку/обещание с использованием шаблона «лучшей практики». Учитывая этот сценарий, как бы вы заставили обработчик щелчка правильно подождать, пока oRes не будет заполнен из основного ответа AJAX или вторичного ответа AJAX после таймаута?
Некоторые примечания для уточнения:
getData1()
должен быть выполнен только после того, как документ будет готов$someEl.click()
может сработать в любой момент во время загрузки документа, поэтому обработчик события должен быть определен вне$(document).ready()
- Я застрял с JQuery 1.7.1
Вот код:
var oRes, dfd;
// Get data from primary source
function getData1() {
dfd = $.ajax({
...
success: function(data) {
oRes = data;
},
error: function(jqXHR, textStatus, errorThrown) {
if (textStatus==='timeout') getData2();
},
timeout: 10000 // 10-second timeout
});
}
// Get data from backup source
function getData2() {
dfd = $.ajax({...});
}
$someEl.click(function() {
dfd.done(function() {
console.log('This should only log when oRes is ready');
});
});
$(document).ready(function() {
getData1();
});
Я моделируется мое положение в этой ручкой: http://codepen.io/thdoan/pen/pyVyKj
По сути, у меня возникают проблемы при получении обработчика событий для вывода «Data готова!» когда oRes
заполняется без необходимости вручную щелкнуть по полю после загрузки страницы.
Просто хотелось бы отметить, что с вашей текущей стратегии, каждый раз, когда $ someEl щелкают будет связать другую функцию обратного вызова для отложенного объекта, поэтому при отсроченный окончательно решил, что он будет выполнять ваш обратный вызов X раз, где X - это количество раз, когда элемент был нажат. Это может быть вашим желаемым поведением, но просто хотелось убедиться, что вы знаете. –
@MattDiamond спасибо за указание на это, очень хорошая точка :). Я изменил код, чтобы вместо этого использовать '.one ('click', ...)'. – 10basetom