Определение свойства объекта через ajax-ответ

goshanoob

Братцы! Вот конструктор, который определяет свойство и метод:
function конструкторчег(){
 this.чиселки=[];
 this.найтиЧиселки=читатьЧиселки;
}
В методе следует определить свойство, но функция, вызываемая для обработки ajax-ответа, судя по всему, не видит этого свойства. Как обойти такую оказию?
function читатьЧиселки(){
 var uri = "TP.html";
 var xhr;
 if (window.XMLHttpRequest) {
         xhr = new XMLHttpRequest();
    }
    else {
        if (window.ActiveXObject) {
            try {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch (e) { }
        }
    }
    if (xhr) {
        xhr.onreadystatechange = выбратьТекст;
        xhr.open("GET", uri, true);
        xhr.send(null);
            }
    else {
        alert("Ошибка при создании XMLHttp запроса");
    }
 var текст;
 var атрибуты=[];
 // var чиселки=[];
    
 function выбратьТекст (){
  if (xhr.readyState == 4) {
   if (xhr.status == 200) {
   текст = xhr.responseText;
   атрибуты=текст.match(/\bvalue=.*\/>/gi);
   
   for (i=0; i<атрибуты.length; i++){
    this.чиселки[i]=parseInt(атрибуты[i].match(/\d+/)); // не канает, т.к. уже есть собственный аяксовский вис
    }
         
    }else {
    alert("Проблема с запросом, статус " + xhr.status);}
            }
            }
  // this.чиселки=чиселки тоже не прокатит, т.к. тогда вообще в функцию выбратьТекст() не заходит
}
Можно было бы просто вернуть значение из вложенной функции, но его не к чему и присвоить даже. А если попробовать присвоить свойству значение вне этой самой функции, то вообще всё крошится.
2 ответа

goshanoob

У Вас вложенная функция использует this для доступа с нужному свойству, но this определяется тем, как эта функция будет вызвана (вызывается ajax запросом). По логике у Вас this внутренней функции должно совпадать с this внешней функцией. Это можно достичь двумя способами.Способ 1. В начале внешней функции пришем var self = this. Внутри внутренней функцией используем всюду self вместо this.Способ 2. Производим связывание внутренней функции с this внешней.
xhr.onreadystatechange = выбратьТекст.bind(this);


goshanoob

Заработало, респект.P.S. Ещё сделал запрос синхронным, чтобы ретёны раньше времени не делались и вообще чтоб как-то дальше с чиселками работать. вот.