Есть два способа справиться с этим: использовать синхронный вызов через $.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);
});
Примечание: они не проверены.