54

利用範囲StudentId外での利用に戻したい$.getJSON()

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

//use studentId here

これはスコーピングに関係していると思いますが、c#と同じようには機能しないようです。

4

6 に答える 6

65

c# と同じように動作しないようです

C# と同様のスコープを実現するには、非同期操作を無効にし、dataType を json に設定します。

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

alert(mydata); // has value of json.whatever
于 2009-06-17T18:28:57.897 に答える
41

ええ、あなたのコードに注意を払っていなかったため、以前の回答は機能しません。:)

問題は、無名関数がコールバック関数であることです。つまり、getJSON は不確定な時点で戻る非同期操作であるため、変数のスコープがその無名関数の外 (つまりクロージャ) であっても、あなたが思うような値を持っていません:

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

getJSON 呼び出しによって設定された studentId の値を使用して実行するコードは、そのコールバック関数内またはコールバックの実行に発生する必要があります。

于 2008-08-27T20:19:51.580 に答える
24

上記のすべてよりもさらに簡単です。前に説明したよう$.getJSONに、問題の原因となる非同期を実行します。すべてのコードをメソッドにリファクタリングする代わりに$.ajax、メインの.jsファイルの先頭に以下を挿入して非同期動作を無効にします。

 $.ajaxSetup({
   async: false
 });

幸運を!

于 2013-03-23T09:07:34.020 に答える
2

他の関数に委任したい場合は、$.fn で jquery を拡張することもできます。次のような表記:


var this.studentId = null;

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

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


于 2009-01-30T02:48:36.047 に答える
-2

うーん、StudentIdプロパティを使用してオブジェクトをシリアル化した場合は、次のようになると思います。

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

しかし、それ自体を返すだけの場合は、StudentIdおそらく次のようになります。

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

編集:または、おそらく.length必要ではありません(JSONでジェネリックコレクションのみを返しました)。

編集#2、これは動作します、私はちょうどテストしました:

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

編集#3、これが私が使用した実際のJSです:

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

そして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
于 2008-08-27T20:38:23.410 に答える