我想回到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 是一个异步操作,它将在某个不确定的时间点返回,因此即使变量的范围在该匿名函数之外(即闭包),它也会没有您认为应有的value:
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
执行 async 会导致问题。无需将所有代码重构为该$.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;
}
var context;
$.ajax({
url: 'file.json',
async: false,
dataType: 'json',
success: function (json) {
assignVariable(json);
}
});
function assignVariable(data) {
context = data;
}
alert(context);