valores valor una retorno retornar pasar otra llamar funciones funcion entre ejemplos javascript jquery ajax scope return-value

javascript - valor - ¿Cómo puedo devolver una variable desde una función $.getJSON?



retornar valor de una funcion javascript a php (6)

Deseo devolver StudentId para utilizar en otro lugar fuera del alcance de $.getJSON()

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

Me imagino que esto tiene que ver con el alcance, pero no parece funcionar de la misma manera que C #


no parece funcionar de la misma manera que C #

Para lograr un alcance similar a C #, deshabilite las operaciones asincrónicas y configure dataType en json:

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


Incluso más simple que todo lo anterior. Como se explicó anteriormente $.getJSON ejecuta la $.getJSON que causa el problema. En lugar de refacturar todo tu código al método $.ajax , simplemente inserta lo siguiente en la parte superior de tu archivo .js principal para deshabilitar el comportamiento asincrónico:

$.ajaxSetup({ async: false });

¡buena suerte!


Sí, mi respuesta anterior no funciona porque no presté atención a tu 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 retornará en algún punto indeterminado, por lo que incluso si el alcance de la variable estuviera fuera de esa función anónima (es decir, un cierre), no tiene el valor que crees 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 desee ejecutar con el valor de studentId establecido por la llamada getJSON debe suceder dentro de esa función de devolución de llamada o después de que se ejecute la devolución de llamada.


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

var this.studentId = null; $.getJSON(url, data, function(result){ $.fn.delegateJSONResult(result.Something); } ); $.fn.delegateJSONResult = function(something){ this.studentId = something; }


hmm, si has serializado un objeto con la propiedad StudentId , entonces creo que será:

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

Pero si solo devuelve el StudentId sí mismo, tal vez sea:

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

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

Editar # 2, esto funciona, acabo de probar:

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

Edite # 3, aquí está el JS real que utilicé:

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

Y en 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


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