2013-11-09 6 views
1

У меня возникли трудности с доступом requestJSON к объекту jQuery $ .ajax за пределами обратного вызова успеха. Если я:Асинхронно заполняет Sammy.Storage cache

var ajax_request = $.ajax({ 
    dataType: 'json', 
    contentType: 'application/json' 
}); 

console.log(ajax_request.responseJSON); 

// this results in `undefined` 

Как я могу получить доступ к responseJSON без добавления .success() обратного вызова? Если я осмотреть ajax_request в Firebug, я могу видеть responseJSON собственность, и данные, которые я ожидал, но я не могу получить доступ к нему через:

ajax_request.responseJSON 

Более конкретно, я строить SPA с помощью Сэмми и Knockout. В некоторых маршрутах, мне нужно, чтобы иметь возможность получить JSON из кэша, и если он не существует, получить значение от вызова службы, а затем установить его в кэш:

var cached_json = storage.fetch('cached_json', function() { 
    // make service call 
    return $.getJSON(url); 
}); 

event_context.render('template.tpl', {'json': cached_json}).appendTo('#my-target'); 

Но, конечно же, называя storage.fetch не приводит к остановке остальной части кода до завершения $ .getJSON. Это та часть, которую я не могу понять, как структурировать.

+0

$ .getJSON (REQUESTPARAMS) –

+1

возможно дубликат [Как вернуть ответ от AJAX вызова?] (Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-a-ajax-call) – Musa

+0

$ .getJSON по умолчанию асинхронно, и в некоторых случаях мне нужно сделать синхронный вызов. Я не вижу вариант конфигурации для .getJSON, чтобы сделать его синхронным ... – Brandon

ответ

0

Я в конечном итоге решил это, создав отложенный объект, который получает или создает значение, что нужно:

function get_or_create_cache(storage, key, service_endpoint) { 
    return $.Deferred(function(deferred) { 
     var c = storage.get(key); 
     if (c === null || c === undefined) { 
      $.when(jsonp_service_request(service_endpoint)).done(function(json) { 
       storage.set(key, json); 
       deferred.resolve(json); 
      }); 
     } 
     else { 
      deferred.resolve(c); 
     } 
    }).promise(); 
} 

В этой функции storage относится к экземпляру Sammy.Storage. jsonp_service_request - это локальная функция, которая возвращает ответ jsonp, принимая во внимание location.hostname для локальной разработки, где я указываю файлы local.json или удаленную среду, в которой я звоню в настоящий API. jsonp_service_request возвращает функцию $.ajax.

Тогда в моем маршруте Сэмми, я могу сделать:

this.get('#/', function(event_context) { 
    $.when(get_or_create_cache(storage, 'my-cache-key', 'service-endpoint')) 
     .then(function(json) { 
      event_context.render('my-template.template', {'value-name': json}) 
       .appendTo('#my-target'); 
     }); 
}); 
0

вот как я бы реализовать

responseJSON = ""; 
$.get("myurl.php",function(jdata){ 
     responseJSON = jdata; 
},"json"); 

я хотел бы видеть метод АЯКС в Glace, но в вашем случае вы можете сделать то же самое

.... 
success : function(jdata){ responseJSON = jdata; } 
.... 

PS: я считаю, что инициализация пустого ответа. JSON не требуется, поскольку любая переменная без var находится в глобальной области, но это помогло бы для ясности.