2011-07-13 10 views
5

Así que tengo este código JS aquí, y estoy tratando de establecer OBJ desde el éxito y las devoluciones de errores, pero aparentemente el alcance de la función toLinkInfo no es un ámbito principal de esos? Siempre obtengo nulo de esta función sin importar nada. Probé un montón de cosas pero no pude hacerlo funcionar, creo que estoy demasiado acostumbrado a C & amigos :) ¿Cómo puedo hacer que esto funcione?Accediendo al ámbito externo en JavaScript

LinkInfoGrabber.prototype.toLinkInfo = function() { 
    var obj = null; 
    $.ajax({ 
     url: this.getRequestUrl(), 
     success: function(raw) { 
      obj = new LinkInfo(raw); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      obj = new LinkInfoException(jqXHR, textStatus, errorThrown); 
     }, 
     dataType: 'html' 
    }); 

    if (obj instanceof LinkInfo) { 
     return obj; 
    } else { 
     throw obj; 
    } 
} 
+0

tal vez la condición no se cumple – Ibu

+0

Ya he visto esta pregunta un par de veces. – ChaosPandion

+0

Mi límite de pensamiento no está funcionando en este momento. ¿Podría agregar el constructor LinkInfo también? – fncomp

Respuesta

3

Esto se debe a que las llamadas AJAX son asincrónicas, ocurren en un momento diferente del resto del contexto.

Intente darle una función de devolución de llamada (llamada de devolución de llamada a continuación).

LinkInfoGrabber.prototype.toLinkInfo = function(callback) { 
    $.ajax({ 
     url: this.getRequestUrl(), 
     success: function(raw) { 
      callback(new LinkInfo(raw)); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      obj = new LinkInfoException(jqXHR, textStatus, errorThrown); 
     }, 
     dataType: 'html' 
    }); 
} 

var l = new LinkInfoGrabber() 
l.toLinkInfo(console.log) //replace console.log with something meaningful 

Si bien este enfoque no proporciona exactamente el mismo resultado que ser capaz de llamar a todo en línea, que tiene la ventaja de permitir a la naturaleza asíncrona de la web.

+0

Cuán hilarante de mí es olvidar que ** JavaScript asincrónico ** y XML son asíncronos. Terminé moviendo la llamada $ .ajax fuera de esa función y eso funciona muy bien. Gracias. –

0

usted está volviendo obj antes de la llamada a ajax devoluciones, así que no es otra cosa que establecer a nula cuando se devuelve.

3

este código:

if (obj instanceof LinkInfo) { 
     return obj; 
    } else { 
     throw obj; 
    } 

se ejecuta inmediatamente después de iniciar la llamada ajax, pero obj no se establece hasta que la llamada ajax finaliza correctamente. Este es un malentendido común. La llamada Ajax es asincrónica. Su llamada a $ .ajax() inicia la llamada asincrónica y luego el resto de su función se ejecuta inmediatamente. El controlador de éxito se llama solo cuando la llamada ajax tiene éxito (algún tiempo después). No puedes devolver obj desde tu función. Debe manejar obj en su controlador de éxito y luego llamar a cualquier otra cosa que desee usar desde el controlador de éxito.

Cuestiones relacionadas