Стренировать возвращаемый объект Object?

В моем файле .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] вместо того, который я хочу.
Как я могу это исправить? Спасибо

Строковое представление объекта по умолчанию - "[object Object]". Вы должны получить доступ к собственности, которую хотите показать.

Felix Kling 10.05.2018 01:27

вы говорите об этом заявлении console.info(JSON.stringify(data));, которое вы хотите распечатать в html

Reborn 10.05.2018 01:27

проблема в том, что api.rooms.getRooms().done(.... возвращает jQuery объект, а не данные, которые вы ожидаете ... так что это похоже на запуск $("#title").text({})

Jaromanda X 10.05.2018 01:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
1 043
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Похоже, вы наткнулись на одну из самых интересных вещей в 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?

Jaromanda X 10.05.2018 01:36

Извините за мой поздний ответ, вот и селектор идентификаторов. например: <h3 id = "my_h3"> ... </h3>

Roberto Aguilar 01.06.2018 20:33

Результат

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);
    }))
});

вместо

Другие вопросы по теме