利用範囲StudentId
外での利用に戻したい$.getJSON()
j.getJSON(url, data, function(result)
{
var studentId = result.Something;
});
//use studentId here
これはスコーピングに関係していると思いますが、c#と同じようには機能しないようです。
利用範囲StudentId
外での利用に戻したい$.getJSON()
j.getJSON(url, data, function(result)
{
var studentId = result.Something;
});
//use studentId here
これはスコーピングに関係していると思いますが、c#と同じようには機能しないようです。
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
ええ、あなたのコードに注意を払っていなかったため、以前の回答は機能しません。:)
問題は、無名関数がコールバック関数であることです。つまり、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 の値を使用して実行するコードは、そのコールバック関数内またはコールバックの実行後に発生する必要があります。
上記のすべてよりもさらに簡単です。前に説明したよう$.getJSON
に、問題の原因となる非同期を実行します。すべてのコードをメソッドにリファクタリングする代わりに$.ajax
、メインの.jsファイルの先頭に以下を挿入して非同期動作を無効にします。
$.ajaxSetup({
async: false
});
幸運を!
他の関数に委任したい場合は、$.fn で jquery を拡張することもできます。次のような表記:
var this.studentId = null;
$.getJSON(url, data,
function(result){
$.fn.delegateJSONResult(result.Something);
}
);
$.fn.delegateJSONResult = function(something){
this.studentId = something;
}
うーん、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