2008-08-27 10 views
45

quiero volver StudentId utilizar cualquier otro lugar fuera del alcance del $.getJSON()

j.getJSON(url, data, function(result) 
{ 
    var studentId = result.Something; 
}); 

//use studentId here 

Me imagino que esto tiene que ver con la determinación del alcance, pero no parece funcionar de la misma manera C# hace

Respuesta

37

Sí, mi respuesta anterior no funciona porque no le presté atención a su código. :)

El problema es que la función anónima es una función de devolución de llamada, es decir, getJSON es una operación asíncrona que regresará en algún punto indeterminado, incluso si el alcance de la variable estuviera fuera de esa función anónima (es decir un cierre), no tendría el valor se podría pensar que debería:

var studentId = null; 
j.getJSON(url, data, function(result) 
{ 
    studentId = result.Something; 
}); 

// studentId is still null right here, because this line 
// executes before the line that sets its value to result.Something 

Cualquier código que desea ejecutar con el valor de studentID establecido por la llamada getJSON tiene que ocurrir ya sea dentro que la función de devolución de llamada o después de se ejecuta la devolución de llamada.

-2

hmm, si ha serializado un objeto con la propiedad StudentId entonces creo que va a ser:

var studentId; 
function(json) { 
    if (json.length > 0) 
     studentId = json[0].StudentId; 
} 

Pero si sólo está devolviendo el StudentId sí quizás es:

var studentId; 
function(json) { 
    if (json.length > 0) 
     studentId = json[0]; 
} 

Editar: O tal vez .length ni siquiera es necesario (solo he devuelto colecciones genéricas en JSON).

Edición # 2, esto funciona, Acabo de probar:

var studentId; 
jQuery.getJSON(url, data, function(json) { 
    if (json) 
     studentId = json; 
}); 

Edición # 3, aquí está la JS reales que he utilizado:

$.ajax({ 
    type: "POST", 
    url: pageName + "/GetStudentTest", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    data: "{id: '" + someId + "'}", 
    success: function(json) { 
     alert(json); 
    } 
}); 

Y en el aspx.vb:

<System.Web.Services.WebMethod()> _ 
<System.Web.Script.Services.ScriptMethod()> _ 
Public Shared Function GetStudentTest(ByVal id As String) As Integer 
    Return 42 
End Function 
2

Si desea delegar en otras funciones, también puede extender jquery con $ .fn. notación de este modo:

 

var this.studentId = null; 

$.getJSON(url, data, 
    function(result){ 
     $.fn.delegateJSONResult(result.Something); 
    } 
); 

$.fn.delegateJSONResult = function(something){ 
    this.studentId = something; 
} 

 
59

que no parece funcionar de la misma manera C#

Para llevar a cabo la determinación del alcance similar a C#, desactivar las operaciones asíncronas y establecer tipo de datos a JSON:

var mydata = []; 
$.ajax({ 
    url: 'data.php', 
    async: false, 
    dataType: 'json', 
    success: function (json) { 
    mydata = json.whatever; 
    } 
}); 

alert(mydata); // has value of json.whatever 
+3

Esta es una solución mucho mejor, ya que getJSON es una llamada asincrónica, por lo que la variable configurada en el delegado no se puede acceder antes de que finalice la llamada asincrónica. – Annagram

+0

¿Curiosamente tuve "& callback =?" en mi URL que parecía anular la configuración async: false. –

+2

¡Gracias! Ahora, puedo hacer algo aquí ... – Rimian

16

Incluso más simple que todo lo anterior. Como se explicó anteriormente, $.getJSON ejecuta una sincronización que causa el problema. En lugar de refactorización todo el código con el método $.ajax sólo tiene que insertar el siguiente en la parte superior de su archivo principal Js desactivar el comportamiento asíncrono:

$.ajaxSetup({ 
    async: false 
}); 

buena suerte!

+2

esta debe ser la respuesta más importante –

+0

Estoy de acuerdo con @MostafaKing – danMad

+0

Esta es, de lejos, la mejor respuesta. Gracias @bicycle. –

-1
var context; 
$.ajax({ 
    url: 'file.json', 
    async: false, 
    dataType: 'json', 
    success: function (json) { 
    assignVariable(json); 
    } 
}); 

function assignVariable(data) { 
    context = data; 
} 
alert(context); 
+0

La pregunta fue hecha hace aproximadamente 9 años y su respuesta no está agregando ninguna mejora significativa a las respuestas ya publicadas. – Khan

Cuestiones relacionadas