Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.02.2017, 09:24
Аватар для villiwalla
Интересующийся
Отправить личное сообщение для villiwalla Посмотреть профиль Найти все сообщения от villiwalla
 
Регистрация: 16.02.2016
Сообщений: 29

Как вернуть не пустой response из класса(объ?
Понятно что возвращается undefined когда вызывается console.log(dt.sendRequest()); т.e onreadydstatechenge == 1. Как вернуть xhr.responseText что бы потом можно было передать в showData (в любую переменную, в любую другую функцию как аргумент). Знаю что для решения можно так showData(xhr.responseText), но этот вариант с внешней функцией для возврата не не нравиться.
var Valute = function (url) {

        this.url = url;

        this.createRequest = function () {
            this.request = new XMLHttpRequest();
            return this.request;
        };

        this.sendRequest = function () {
            var xhr = this.createRequest();
                xhr.open('GET', this.url, true);
                xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && xhr.status == 200) {
                    return xhr.responseText;
                }
            };
            xhr.send(null);
        };

    };

    var dt = new Valute('data.text.html');
    console.log(dt.sendRequest());

    function showData(data) {
        let wrap = document.querySelector('#curs');
        wrap.innerText = data;
    }

Последний раз редактировалось villiwalla, 20.02.2017 в 09:32.
Ответить с цитированием
  #2 (permalink)  
Старый 20.02.2017, 09:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,148

villiwalla,

var Valute = function (url, callback) ...
if(xhr.readyState == 4 && xhr.status == 200) {
                    callback(xhr.responseText);
                }

 Valute('data.text.html',showData);
Ответить с цитированием
  #3 (permalink)  
Старый 20.02.2017, 10:09
Аватар для villiwalla
Интересующийся
Отправить личное сообщение для villiwalla Посмотреть профиль Найти все сообщения от villiwalla
 
Регистрация: 16.02.2016
Сообщений: 29

рони,
Спасибо. могли-бы также подсказать по этому же примеру. Если я хочу записать в переменную объекта, результат xhr.responseText после вызова dt.sendRequest(). Я делал так:
var Valute = function () {
this.response = null;

var that = this.response;

 this.sendRequest = function () {
            var xhr = this.createRequest();
                xhr.open('GET', this.url, true);
                xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && xhr.status == 200) {
                   that = xhr.responseText;
                }
            };
            xhr.send(null);
        };

}


Но данная конструкция не работает.
Ответить с цитированием
  #4 (permalink)  
Старый 20.02.2017, 10:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,148

villiwalla,
придут специалисты они вам обьяснят, но учитесь формировать алгоритмы асинхронно ... послали запрос серверу и забыли ... когда нибудь придёт ответ и сработает callback ... рыть в сторону promise
Ответить с цитированием
  #5 (permalink)  
Старый 20.02.2017, 11:02
Аватар для villiwalla
Интересующийся
Отправить личное сообщение для villiwalla Посмотреть профиль Найти все сообщения от villiwalla
 
Регистрация: 16.02.2016
Сообщений: 29

Rise,
если я в этой теме ещё плохо разобрался, куда мне в тему fetch лезть?
Ответить с цитированием
  #6 (permalink)  
Старый 20.02.2017, 11:49
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Цитата:
Если я хочу записать в переменную объекта, результат xhr.responseText после вызова dt.sendRequest()
alert(typeof null)

Это ответ на все твои вопросы. Ты просто меняешь указатель that после прихода ответа, но это никак не отразится на Valute.response.
Ответить с цитированием
  #7 (permalink)  
Старый 20.02.2017, 13:50
Аватар для villiwalla
Интересующийся
Отправить личное сообщение для villiwalla Посмотреть профиль Найти все сообщения от villiwalla
 
Регистрация: 16.02.2016
Сообщений: 29

Сообщение от Rise Посмотреть сообщение
villiwalla, так в какой теме плохо разобрался в классах или асинхронном коде, зачем их смешал тогда, разберись по отдельности; даже если запишешь ответ в переменную объекта, сразу (синхронно) его не получишь, а получишь не сразу (асинхронно); самый примитивный пример асинхронности это setTimeout тренируйся на нем если не понимаешь что это такое:
var requestTime = 5000;
var responseText = 'сразу (синхронно)';

setTimeout(function(){
    responseText = 'не сразу (асинхронно)';
    alert('2. ' + responseText);
}, requestTime);

alert('1. ' + responseText);

// ты ожидаешь такой ответ '1. не сразу (асинхронно)' но это не верно.
Эту ошибку, я уже понял. Меня сейчас интересует, как можно записать ответ в перемеренную внутри объекта.

var Valute = function () {
this.response = null; // = xhr.responseText

var that = this.response;

 this.sendRequest = function () {
            var xhr = this.createRequest();
                xhr.open('GET', this.url, true);
                xhr.onreadystatechange = function () {
                if(xhr.readyState == 4 && xhr.status == 200) {
                   that = xhr.responseText;  // undefined
                }
            };
            xhr.send(null);
        };

};
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать цитатник? WGN Общие вопросы Javascript 10 29.01.2017 01:39
Как вернуть результат функции в литерал объекта komplekt_17 Общие вопросы Javascript 12 14.01.2017 20:22
как вернуть переменую в swfupload ureech jQuery 13 01.05.2016 20:43
Как запретить ввод пустой строки в promtp? Zuko Events/DOM/Window 2 07.04.2015 20:13
Вернуть значение из HTTP Response Viper jQuery 0 05.10.2008 15:52