我有一个功能,getJSON但它不像我预期的那样工作.
function balbla(name, param) {
$.getJSON("/blabla.json?name=" + name + "¶m=" + param, function(data) {
return data.bla;
});
}
Run Code Online (Sandbox Code Playgroud)
当我alert(data.bla)在getJSON方法中使用时,它可以工作,但是当我尝试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;
});
}
Run Code Online (Sandbox Code Playgroud)
但是当我称之为getRoute("bla", "blub")它仍然返回undefined.
AJAX是异步的.您不能轻易地在依赖于AJAX调用结果的函数中返回值.更改您的函数以接受回调:
function balbla(name, param, cb) {
$.getJSON('/blabla.json', {name:name, param: param}, function(data) {
cb(data.bla);
});
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
balbla('foo', 'bar', function(bla) {
// do stuff
});
Run Code Online (Sandbox Code Playgroud)
更简洁的方法是返回jqXHR对象:
function balbla(name, param) {
return $.getJSON('/blabla.json', {name:name, param: param});
}
Run Code Online (Sandbox Code Playgroud)
调用它时,使用jqXHR对象的deferred/promise接口附加成功回调:
balbla('foo', 'bar').done(function(data) {
alert(data.bla);
});
Run Code Online (Sandbox Code Playgroud)
请注意,$.ajax()在同步模式下使用不是您应该考虑的选项.它可能会挂起浏览器的UI(或至少是活动选项卡),直到请求完成.除此之外,异步回调是每个人都这样做的方式.
如果您不喜欢使用回调函数,可以使用tamejs之类的预处理器自动生成异步函数.
| 归档时间: |
|
| 查看次数: |
664 次 |
| 最近记录: |