How can I return a variable from a $.getJSON function

前端 未结 6 1315
迷失自我
迷失自我 2020-11-27 03:01

I want to return StudentId to use elsewhere outside of the scope of the $.getJSON()

j.getJSON(url, data, function(result)
         


        
相关标签:
6条回答
  • 2020-11-27 03:32

    If you wish delegate to other functions you can also extend jquery with the $.fn. notation like so:

    
    var this.studentId = null;
    
    $.getJSON(url, data, 
        function(result){
          $.fn.delegateJSONResult(result.Something);
        }
    );
    
    $.fn.delegateJSONResult = function(something){
      this.studentId = something;
    }
    
    
    
    0 讨论(0)
  • 2020-11-27 03:35

    Yeah, my previous answer does not work because I didn't pay any attention to your code. :)

    The problem is that the anonymous function is a callback function - i.e. getJSON is an async operation that will return at some indeterminate point in time, so even if the scope of the variable were outside of that anonymous function (i.e. a closure), it would not have the value you would think it should:

    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
    

    Any code that you want to execute with the value of studentId set by the getJSON call needs to happen either within that callback function or after the callback executes.

    0 讨论(0)
  • 2020-11-27 03:35

    it doesn't seem to work the same way c# does

    To accomplish scoping similar to C#, disable async operations and set dataType to json:

    var mydata = [];
    $.ajax({
      url: 'data.php',
      async: false,
      dataType: 'json',
      success: function (json) {
        mydata = json.whatever;
      }
    });
    
    alert(mydata); // has value of json.whatever
    
    0 讨论(0)
  • 2020-11-27 03:37

    hmm, if you've serialized an object with the StudentId property then I think that it will be:

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

    But if you're just returning the StudentId itself maybe it's:

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

    Edit: Or maybe .length isn't even required (I've only returned generic collections in JSON).

    Edit #2, this works, I just tested:

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

    Edit #3, here's the actual JS I used:

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

    And in the 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
    
    0 讨论(0)
  • 2020-11-27 03:38
    var context;
    $.ajax({
      url: 'file.json',
      async: false,
      dataType: 'json',
      success: function (json) {   
        assignVariable(json);
      }
    });
    
    function assignVariable(data) {
      context = data;
    }
    alert(context);
    
    0 讨论(0)
  • 2020-11-27 03:39

    Even simpler than all the above. As explained earlier $.getJSON executes async which causes the problem. Instead of refactoring all your code to the $.ajax method just insert the following in the top of your main .js file to disable the async behaviour:

     $.ajaxSetup({
       async: false
     });
    

    good luck!

    0 讨论(0)
提交回复
热议问题