Вопрос

У меня возникли проблемы с получением правильной области видимости в Ajax прототипа.Класс запроса.То, что я пытаюсь сделать, это написать простой API, который обертывает ajax-запросы:

API = Class.create({

  initialize:function(api_token)
  {
    this.api_token = api_token;
    this.request_uri = new Template('/api/#{api_token}/#{resource}.json');
    this.status = 0;
    this.last_result = null;
  },

  some_api_call:function()
  {
    var result = this._request('resource', {'id':1});
    // and so on...
  },

  _request:function(resource, params)
  {
    var uri = this.request_uri.evaluate({"api_token":this.api_token,"resource":resource});
    new Ajax.Request(uri,
    {
      contentType:'application/json',
      method:'get',
      parameters:params,
      onSuccess:function(r)
      {
        alert(this);
        this.last_result = r.responseJSON;
        this.status = r.status;
      }
    });    
    return this.last_result;
  }

});

Когда я использую метод onSuccess(), я ожидал, что + this + будет ссылаться на родительский объект, но он выдает мне DOMWindow .Кажется, я вообще не могу перенести эти данные ответа в класс API.Я понимаю, что это что-то глупое (обязательное?), Но, похоже, я просто не могу додумать это до конца сегодня.

Спасибо

Это было полезно?

Решение

Ладно.Я упустил более серьезную проблему.Я запрашивал асинхронно, так что это был настройка результата, просто не сразу.Справедливости ради, это также было обязательным вопросом.Вот надлежащий запрос:

_request:function(resource, params)
{
  var uri = this.request_uri.evaluate({"api_token":this.api_token,"resource":resource});
  new Ajax.Request(uri,
  {
    asynchronous: false,
    contentType:'application/json',
    method:'get',
    parameters:params,
    onSuccess:function(r)
    {
      this.last_result = r.responseJSON;
      this.status = r.status;
    }.bind(this)
  });    

  alert(this.status);

  return this.last_result;
}

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

Ваше решение НЕ должно работать?

Вам нужно использовать локальные переменные над вложенной функцией, а затем преобразовать их в область 'this':

 _request:function(resource, params)
    {
      var uri = this.request_uri.evaluate({"api_token":this.api_token,"resource":resource});
      var last_result = "";
      var status = "";
      new Ajax.Request(uri,
      {
        asynchronous: false,
        contentType:'application/json',
        method:'get',
        parameters:params,
        onSuccess:function(r)
        {
          last_result = r.responseJSON;
          status = r.status;
        }
      });  
      this.last_result = last_result;
      this.status = status;  
      alert(this.status);
      return this.last_result;
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top