异步填充Sammy.Storage缓存

时间:2013-11-09 04:47:43

标签: ajax jquery sammy.js

我在成功回调之外的jQuery $ .ajax对象上访问requestJSON时遇到了困难。如果我这样做:

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

console.log(ajax_request.responseJSON);

// this results in `undefined`

如何在不添加.success()回调的情况下访问responseJSON?如果我在Firebug中检查ajax_request,我可以看到responseJSON属性和我期望的数据,但我无法通过以下方式访问它:

ajax_request.responseJSON

更具体地说,我正在使用Sammy和Knockout构建SPA。在某些路由中,我需要能够从缓存中获取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完成。这是我无法弄清楚如何构建的部分。

2 个答案:

答案 0 :(得分:0)

这是我将如何实现它

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

我喜欢在glace看到ajax方法,但在你的情况下,你可以通过

来做同样的事情。
....
success : function(jdata){ responseJSON = jdata; }
....

PS:我认为不需要初始化空白responseJSON,因为任何没有var的变量都在全局范围内,但它有助于清晰

答案 1 :(得分: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函数。

然后在我的Sammy路线中,我可以做到:

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');
        });
});