1

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

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

console.log(ajax_request.responseJSON);

// this results in `undefined`

如何在不添加.success()回调的情况下访问 responseJSON?如果我ajax_request在 Firebug 中进行检查,我可以看到该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 完成。这是我无法完全弄清楚如何构建的部分。

4

2 回答 2

0

这是我将如何实现它

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

我喜欢快速查看 ajax 方法,但在您的情况下,您可以通过

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

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

于 2013-11-09T05:09:35.017 回答
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');
        });
});
于 2013-11-09T15:56:00.937 回答