Pregunta

Estoy teniendo problemas para conseguir el alcance correcto dentro de la clase Ajax.Request del prototipo. Lo que estoy tratando de hacer es escribir una API simple que envuelve las peticiones 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;
  }

});

Cuando estoy en el método onSuccess () que esperaba este + + para referirse al objeto padre, pero me está dando DOMWindow. Me parece que no puede conseguir que los datos de respuesta en la clase API en absoluto. Calculo que es algo estúpido (unión?), Pero me parece que no puede pensar éste hacia fuera hoy.

Gracias

¿Fue útil?

Solución

Está bien. Me perdí el problema más grande. Yo estaba solicitando de forma asíncrona por lo que fue poniendo el resultado, pero no inmediatamente. Para ser justos, también era una cuestión de unión. Aquí está la solicitud adecuada:

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

Otros consejos

Su solución no debe trabajar?

Es necesario utilizar variables locales por encima de la función anidada y luego convertirlos en el 'este' ámbito de aplicación:

 _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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top