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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top