Como posso retornar uma variável a partir de um $.função getJSON
-
09-06-2019 - |
Pergunta
Eu quero voltar StudentId
para usar em outro lugar fora dos âmbito de aplicação do $.getJSON()
j.getJSON(url, data, function(result)
{
var studentId = result.Something;
});
//use studentId here
Eu imagino que isso tem a ver com a delimitação do âmbito, mas ele parece não funcionar da mesma maneira c# não
Solução
Sim, a minha resposta anterior, não trabalho, porque eu não prestei atenção ao seu código.:)
O problema é que a função anônima é uma função de retorno de chamada - i.e.getJSON é uma operação assíncrona que vai voltar em algum ponto indeterminado no tempo, de modo que, mesmo se o escopo da variável fora da função anônima (i.e.um encerramento), não teria o valor que você acha que deve:
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
Qualquer código que você deseja executar com o valor de studentId definido pelo getJSON chamada precisa acontecer dentro que a função de retorno de chamada ou depois de o retorno de chamada é executado.
Outras dicas
ele não parece funcionar da mesma forma c# não
Para realizar a delimitação do âmbito semelhante ao C#, desactivar operações assíncronas e definir o tipo de dados json:
var mydata = [];
$.ajax({
url: 'data.php',
async: false,
dataType: 'json',
success: function (json) {
mydata = json.whatever;
}
});
alert(mydata); // has value of json.whatever
Ainda mais simples do que todas as anteriores.Como explicado anteriormente $.getJSON
executa assíncrono que faz com que o problema.Em vez de refatoração todo o seu código para o $.ajax
método basta inserir o seguinte no topo da sua principal .arquivo js para desativar o comportamento assíncrono:
$.ajaxSetup({
async: false
});
boa sorte!
Se você deseja delegar a outras funções também é possível estender o jquery com o $.fn.notação assim:
var this.studentId = null;
$.getJSON(url, data,
function(result){
$.fn.delegateJSONResult(result.Something);
}
);
$.fn.delegateJSONResult = function(something){
this.studentId = something;
}
var context;
$.ajax({
url: 'file.json',
async: false,
dataType: 'json',
success: function (json) {
assignVariable(json);
}
});
function assignVariable(data) {
context = data;
}
alert(context);
hmm, se você tiver um objeto serializado com o StudentId
propriedade, em seguida, eu acho que vai ser:
var studentId;
function(json) {
if (json.length > 0)
studentId = json[0].StudentId;
}
Mas se você está apenas retornando o StudentId
em si talvez seja:
var studentId;
function(json) {
if (json.length > 0)
studentId = json[0];
}
Editar:Ou talvez .length
não é mesmo necessário (eu só voltou genérico coleções em JSON).
Edição #2, isso funciona, eu testei:
var studentId;
jQuery.getJSON(url, data, function(json) {
if (json)
studentId = json;
});
Edição #3, eis o real da JS que eu usei:
$.ajax({
type: "POST",
url: pageName + "/GetStudentTest",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "{id: '" + someId + "'}",
success: function(json) {
alert(json);
}
});
E em 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