如何编写一个函数,通过$.get
返回从服务器获取的值?
这是我尝试过的,但不起作用:
function getMessage(key) {
$.get("/messages.json", function(data) {
return data.messages[key];
}, "json");
}
有什么想法吗?
答案 0 :(得分:4)
因为Ajax请求是异步。这就是为什么你必须将回调传递给$.get
来处理数据一旦可用。但是getMessage
函数在执行$.get
回调之前返回
您必须传递一个使用返回值执行某些操作的回调。 E.g:
function getMessage(key, cb) {
$.get("/messages.json", function(data) {
cb(data.messages[key]);
}, "json");
}
getMessage('foo', function(data) {
alert(data);
});
当然你也可以将callack直接传递给$.get
并处理数据提取:
function getMessage(cb) {
$.get("/messages.json", cb);
}
答案 1 :(得分:0)
有两种方法可以解决此问题:通过$.ajax
使用同步调用或将回调传递给函数,而不是让它返回值。后者是处理AJAX的规范方式,因为它保留了调用的异步性质。
<强>异步强>
function processMessage(key,elem,cb) {
$.get('/messages.json', function(data) {
if (cb && typeof(cb) === 'function') {
cb.apply(elem,data.messages[key]);
}
}
}
$('.something').each( function() {
processMessage('somekey', this, function(msg) {
$(this).append(msg);
});
});
同步 - 尽量不这样做,因为您将锁定浏览器直到完成。
function getMessage(key)
{
var result = '';
$.ajax({
url: '/messages.json',
aSync: false,
type: 'get',
dataType: 'json',
success: function(data) {
result = data.messages[key];
}
});
return result;
}
$('.something').each( function() {
var msg = getMessage('somekey');
$(this).append(msg);
});
注意:这些是未经测试的。