Javascript 为什么return在getJSON中不起作用,为什么我不能从getJSON写入变量?
我有一个使用Javascript 为什么return在getJSON中不起作用,为什么我不能从getJSON写入变量?,javascript,jquery,Javascript,Jquery,我有一个使用getJSON的函数,但它的工作方式与我预期的不同 function balbla(name, param) { $.getJSON("/blabla.json?name=" + name + "¶m=" + param, function(data) { return data.bla; }); } 当我在getJSON方法中使用alert(data.bla)时,它可以工作,但当我尝试return d
getJSON
的函数,但它的工作方式与我预期的不同
function balbla(name, param) {
$.getJSON("/blabla.json?name=" + name + "¶m=" + param, function(data) {
return data.bla;
});
}
当我在getJSON方法中使用alert(data.bla)
时,它可以工作,但当我尝试return data.bla时,它不能工作。另外,当我创建一个变量并尝试将data.bla的值写入其中时,它根本不起作用
//我试过这个:
function getRouteData(name, param) {
return $.getJSON('/routes_js.json', {route:name, opt: param});
}
function getRoute(name, param) {
getRouteData(name, param).done(function(data) {
return data.route;
});
}
但是当我调用getRoute(“bla”,“blub”)
时,它仍然返回未定义的AJAX是异步的。在这种依赖于AJAX调用结果的函数中,很难返回值。更改函数以接受回调:
function balbla(name, param, cb) {
$.getJSON('/blabla.json', {name:name, param: param}, function(data) {
cb(data.bla);
});
}
balbla('foo', 'bar').done(function(data) {
alert(data.bla);
});
然后像这样使用它:
balbla('foo', 'bar', function(bla) {
// do stuff
});
更干净的方法是返回jqXHR对象:
function balbla(name, param) {
return $.getJSON('/blabla.json', {name:name, param: param});
}
调用它时,使用jqXHR对象的延迟/承诺接口附加一个成功回调:
function balbla(name, param, cb) {
$.getJSON('/blabla.json', {name:name, param: param}, function(data) {
cb(data.bla);
});
}
balbla('foo', 'bar').done(function(data) {
alert(data.bla);
});
注意,在同步模式下使用<代码> $.Ajax()/代码>不是你应该考虑的选项。它可能会挂起浏览器的UI(或至少是活动选项卡),直到请求完成。除此之外,异步回调是每个人都采用的方式
如果不喜欢使用回调函数,可以使用预处理器(如)自动生成异步函数。是异步的,而不是同步的。您需要使用回调,因此您的逻辑需要分两步完成。调用步骤和处理步骤。使用返回语句调用函数:
function(data) {
return data.bla;
}
…没有被您的代码调用(它在jQuery的深处被调用),因此您无法将赋值放在函数调用的左侧
它也作为异步函数的一部分被调用,因此balbla
函数将在调用匿名函数之前完成运行并返回
如果要对响应数据执行某些操作,在匿名回调函数中执行,,即使同步,其代码也可能重复,因为return
语句不在blablabla函数中。只需返回$.getJSON
并让调用代码使用承诺附加回调,就可以大大简化此操作。您也可以通过这种方式免费获得错误回调。谢谢您的回答。我试过使用secound清洁剂,但对我来说仍然不起作用!您使用的是旧的jQuery版本吗?你有错误吗?你的真实代码是什么样子的?您发布的内容闻起来像是一个您从未尝试运行过的示例(例如,函数名看起来输入错误)。我使用回调尝试了它,现在可以运行了。我正在使用最新的jquery函数。这个函数就像我试图运行它一样。