Вход

Просмотр полной версии : Как вернуть не пустой response из класса(объ?


villiwalla
20.02.2017, 09:24
Понятно что возвращается 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;
}

рони
20.02.2017, 09:31
villiwalla,

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

Valute('data.text.html',showData);

villiwalla
20.02.2017, 10:09
рони,
Спасибо. могли-бы также подсказать по этому же примеру. Если я хочу записать в переменную объекта, результат 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);
};

}


Но данная конструкция не работает.

рони
20.02.2017, 10:57
villiwalla,
придут специалисты они вам обьяснят, но учитесь формировать алгоритмы асинхронно ... послали запрос серверу и забыли ... когда нибудь придёт ответ и сработает callback ... рыть в сторону promise (https://learn.javascript.ru/promise)

villiwalla
20.02.2017, 11:02
Rise,
если я в этой теме ещё плохо разобрался, куда мне в тему fetch лезть?

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

alert(typeof null)
Это ответ на все твои вопросы. Ты просто меняешь указатель that после прихода ответа, но это никак не отразится на Valute.response.

villiwalla
20.02.2017, 13:50
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);
};

};