【问题标题】:AJAX JQuery Deferred callbacks only get called onceAJAX JQuery 延迟回调只被调用一次
【发布时间】:2011-03-21 16:02:20
【问题描述】:

我正在为一些 jquery ajax 对象注册回调。

所以我有:

function main_getLogin( options ){
    g_userXHR = $.ajax({
        url:'ajx/_account.aspx',  
        type:'POST' ,cache:false, dataType:'json'
        })
        .success( function(data){
            //var loginData = data.ACCOUNT_INFO;
            //dlog(data);
    });

}

稍后再回电 - 其他地方

g_userXHR.success(function(d,status){
d = d.ACCOUNT_INFO;
if(d.NAME != "" && d.ERRORS.length == 0){//logged in

    $('#myRHpage .registeredUser').show();
    $('#myRHpage .unregisteredUser').hide();
    setupTabs();
}
else{//user is not logged in 

    $('#myRHpage .unregisteredUser').show();
    $('#myRHpage .registeredUser').hide();
}

});

这个回调和所有其他回调在我第一次启动时完美运行

main_getLogin();

直接连接到 g_userXHR 的 .success 每次都会被调用,但是附加在函数之外的其他回调只有在我第一次调用 main_getLogin() 时才会被触发;

另外,有没有什么方法可以声明一个ajax对象,以后再发送。 像 g_userXHR.send();

谢谢

【问题讨论】:

    标签: javascript jquery ajax jquery-deferred


    【解决方案1】:

    如果“其他地方”的代码没有在每次调用“main_getLogin()”时重新添加那些“成功”回调,那么它们将不会运行。每次调用“$.ajax”都会构造一个全新的“Deferred”对象,因此您对第一个对象所做的操作不会影响 jQuery 为您构建的下一个此类对象。

    如果你想总是在成功后做某些事情,你可以使用“$.ajaxSuccess()”:

    $.ajaxSuccess(function() { ... });
    

    【讨论】:

    • 什么是读取这些回调的有效方法,或者以某种方式拥有一个全局对象......我很想说g_userXHR.resend();
    • 谢谢你——你是天赐之物
    • 经过一番思考,又看看ajaxSuccess,有没有别的办法?我有很多不同的 ajax 调用,如果必须将我的所有逻辑都包装在 $.ajaxSuccess 中,那将是一种耻辱 - 然后 if 条件来分析实际调用它的内容。
    • 好吧,如果你必须做一些特别的事情,那么我看不到任何替代方案,只能确保每次启动新的 ajax 请求时都会调用代码。
    • 再次感谢您的关注。只是为了确保。有没有办法获取一个 XHR 对象并简单地重新发送它?看起来很有趣...此外,您对我如何确保重新附加延期的有什么建议吗?现在我能想到的只是一个全局函数,可以将它们全部重新连接...草率 - 但可能没问题 edit:: - 另一个想法 - 我今天早上早些时候尝试过,但记不起问题了我遇到了......我可以使用我自己的自定义延迟函数作为 ajax 调用的包装器吗?这样我就可以控制什么时候解决和承诺得到处理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多