Для организации работы с асинхронным кодом (
XMLHttpRequest или
setTimeout) нужно использовать функции, возвращающие объекты
promise, поскольку функция завершит свою работу в потоке раньше, чем будет выполнен асинхронный вызов.
В
jQuery для этого реализован
Deferred Object. Причём в методе
ajax() он реализован по умолчанию.
Вот примерно так с проверкой на наличие объекта:
testj('1').then(function (json) {
console.log(json);
});
function testj (e) {
var d = $.Deferred(),
x = ...; //Проверяем, вдруг объект уже получен и сохранён
if (x) { //Объект уже есть
d.resolve(x);
} else { //Объект нужно загрузить
$.ajax({
url: 'http://localhost/ajax.json?get=' + e,
dataType: 'json'
}).done(function (data) {
... //Например, сохраняем
d.resolve(data);
});
}
return d.promise();
}
И откройте тайну — зачем вам
jsonp? Вы не используете
callback.