У меня проблема с ожиданием существования элементов DOM.Async xhr и callback
Прежде всего, я делаю XHR к моему бэкэнду и получить некоторую информацию оттуда:
$(document).ready(function() {
var searchParam, searchStr;
// some values to vars
loadTags(15,highlightAndSearchTags(searchParam,searchStr));
});
функции здесь:
function highlightAndSearchTags(searchParam, searchStr) {
if (searchParam == 'tags') {
var selectedTags = searchStr.split(',');
console.log($("#my_favorite_latin_words").children().length); // sometimes returns 0, sometimes returns number of <span> in the div (see loadTags())
for (var i = 0; i < selectedTags.length; i++) {
$("#" + selectedTags[i]).toggleClass("tag-selected");
}
}
}
function loadTags(showedTagsLength, callback) {
var xhr = new XMLHttpRequest();
xhr.open('GET', apiUrl + "tags/", true);
xhr.withCredentials = true;
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status != 200) {
console.log(xhr.responseText);
}
else {
tagList = JSON.parse(xhr.responseText);
tagList = tagList.results;
for (var i = 0; i < showedTagsLength; i++) {
$("#my_favorite_latin_words").append("<span id=\'" + tagList[i].tag_pk + "\'>" + tagList[i].name + "</span>");
}
}
setTimeout(callback, 1); //found this trick somewhere on stackoverflow
}
};
xhr.send();
}
Как вы можете видеть, что есть обратный вызов, который выполняется через 1 мс тайм-аута (я нашел этот трюк где-то в стеке некоторое время назад), но тогда другая функция не видит присоединенных элементов время от времени. Я также попытался
callback.call()
не повезло до сих пор.
Может ли кто-нибудь посоветовать, как правильно подобрать элементы в этом случае?
'loadTags (15, highlightAndSearchTags (searchParam, searchStr));' -> Это вызывает 'highlightAndSearchTags (searchParam, searchStr)' немедленно и проходит возврат значение ('undefined') для' loadTags' как 'callback' – Andreas
нет необходимости в трюке setTimeout - ваша проблема в том, что @Andreas указал ... do' loadTags (15, function() {highlightAndSearchTags (searchParam , searchStr);}); 'вместо –