В моем файле .js есть следующее
api.rooms = class {
static get url() {
return "http://127.0.0.1:8080/api/rooms/";
}
static getRooms() {
return $.ajax({
url: api.rooms.url,
method: "GET",
dataType: "json",
timeout: api.timeout,
}).then(function(data) {
return data.rooms.map(item => item.name)[0]; //Works OK!
});
}
}
$(document).ready(function() {
$("#title").text(api.rooms.getRooms().done(function(data) {
console.info(JSON.stringify(data));
}).fail(function(jqXHR, textStatus, errorThrown) {
console.info("Request failed: jqXHR.status = " + jqXHR.status + ",
textStatus = " + textStatus + ", errorThrown = " + errorThrown);
}))
});
Теперь getRooms (), похоже, работает нормально, и когда я тестирую весь свой код, консоль печатает то, что должна печатать. Но я хочу взять то, что напечатано в консоли, и вместо того, чтобы печатать это там, заменив текст в моем элементе «h3» с идентификатором «title» на этот. Оказывается, мой элемент с идентификатором 'title' и тегом 'h3' в конечном итоге имеет текст [object Object] вместо того, который я хочу.
Как я могу это исправить? Спасибо
вы говорите об этом заявлении console.info(JSON.stringify(data));, которое вы хотите распечатать в html
проблема в том, что api.rooms.getRooms().done(.... возвращает jQuery объект, а не данные, которые вы ожидаете ... так что это похоже на запуск $("#title").text({})



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, вы наткнулись на одну из самых интересных вещей в Javascript: функции обратного вызова! К сожалению, как вы обнаружили, фактическое возвращаемое значение api.rooms.getRooms().done (или, на самом деле, .done().fail) не так полезно. Вероятно, вы имели в виду:
$(document).ready(function() {
api.rooms.getRooms().done(function(data) {
var rooms = JSON.stringify(data);
console.info(rooms);
$("#title").text(rooms); // <<< sets the DOM element <<<
}).fail(function(jqXHR, textStatus, errorThrown) {
console.info("Request failed: jqXHR.status = " + jqXHR.status + ",
textStatus = " + textStatus + ", errorThrown = " + errorThrown);
});
});
Когда api.getRooms().done() вернется, скорее всего, он еще не сделал сетевой запрос! Он договорился, что вызовет эту функцию, если данные вернутся успешно:
function(data) {
var rooms = JSON.stringify(data);
console.info(rooms);
$("#title").text(rooms); // <<< sets the DOM element <<<
}
Это очень распространенный стиль в JS. Сетевые запросы занимают много времени, и мы можем захотеть заняться другими делами, пока ждем завершения запроса. Решение состоит в том, чтобы передать function(data), который сообщит JS, что делать, когда data будет готов. Фактическое значение, возвращаемое этими функциями, не используется и не имеет значения.
Это часть асинхронного программирования: вместо использования return rooms; в конце функции callback мы вызываем другую функцию, например $("#title").text(rooms);, чтобы действительно что-то сделать после того, как данные вернутся.
Для получения дополнительных примеров стиля передачи продолжения (который я использовал здесь), а также информации об аду обратных вызовов и способах его избежать, эти статьи могут указать вам новые направления для продвижения вашего обучения:
1 Единственное место, где используется возвращаемое значение, - это удобное место для зависания вызовов .done() и .fail(). Это [object Object], который вы видите. После того, как вы назначили обратные вызовы done и fail, вам больше никогда не понадобится этот объект.
Теоретически этот объект не является важной частью стиля передачи продолжения, и не каждая библиотека работает таким образом. Он просто позволяет связать вызовы .done() и .fail() (которые также возвращают этот объект для объединения) и делает ваш код красивым. Дизайнер также мог бы сделать аргументы обратного вызова done и fail для запроса, что алгебраически проще, но труднее читать на практике:
api.rooms.getRooms(function done(data) {...}, function fail(...) {...})
Вам нужно указать, какое свойство объекта вы хотите распечатать. Stringify преобразует содержимое объекта в строку. Итак, если вы хотите, чтобы ваш титул был собственностью, сделайте что-нибудь вроде.
$('#my_h3').text( data.title );
что такое #my_h3?
Извините за мой поздний ответ, вот и селектор идентификаторов. например: <h3 id = "my_h3"> ... </h3>
Результат
api.rooms.getRooms().done(function(data) {
console.info(JSON.stringify(data));
}).fail(function(jqXHR, textStatus, errorThrown) {
console.info("Request failed: jqXHR.status = " + jqXHR.status + ",
textStatus = " + textStatus + ", errorThrown = " + errorThrown);
})
это jQuery объект
Итак, ваш код эквивалентен
$("#title").text({})
Любой объект здесь приведет к тому, что содержимое #title будет [object Object].
Асинхронность не может быть сокращена ... вам нужно сделать что-то вроде
$(document).ready(function() {
api.rooms.getRooms().done(function(data) {
$("#title").text(JSON.stringify(data));
}).fail(function(jqXHR, textStatus, errorThrown) {
console.info("Request failed: jqXHR.status = " + jqXHR.status + ",
textStatus = " + textStatus + ", errorThrown = " + errorThrown);
}))
});
вместо
Строковое представление объекта по умолчанию -
"[object Object]". Вы должны получить доступ к собственности, которую хотите показать.