【问题标题】:jQuery .then() and success block do not work together?jQuery .then() 和成功块不能一起工作?
【发布时间】:2014-12-11 21:07:14
【问题描述】:

我正在运行 jQuery 版本 1.10.X(是的!我有点慢!)并面临这个奇怪的问题,如果我有一个 success 块,doneFilterfailFilter.then() 内部传递就不起作用在 ajax 调用中。

然而,这在我看来像是我自己的代码库的问题。证明(..或者可能不是..)? I tried a simple example。示例中的一切正常,正如我所料,successdoneFilter 已排队并执行。

现在在我的代码库中,与上面的示例完全相似,如果我有一个奇怪的 success 块,.then() 部分不会执行。删除成功块启用 .then() 并且 doneFilter / failFilter 被执行。

奇怪的是,在我的同一个代码库中,如果我有 jQuery - 1.7.X,它们都可以很好地发挥作用。会不会因为 ajax 框架在 1.8 及更高版本中发生的变化而成为问题?

如果没有,关于如何找出问题所在的任何提示?我检查了用作doneFilterfailFilter 的方法。没有语法错误。他们只是暂时的。包含控制台语句的函数。

代码:

function getMonster (){
    var theMonster = $.ajax({
      url : "http://codepen.io/chriscoyier/pen/difoC.html",
      success : function(data){
        console.log("Monster Succeeded inside 'success' block");
      }
    });    
    return theMonster;
}

var theMonster = getMonster();
theMonster.then (function(){
    console.log("Moster Succeeded outside");
}, function(){
    console.log("Monster Failed  :(");
});

编辑:

我正在做一个ajaxSetup,如下所示。

$.ajaxSetup({
    beforeSend: function(jqXHR) {
        if ($.cookie("mycookie") == null) {
            console.info("Expired Session");
            AppModule.timeout();
            return false;
        }
    }
});

编辑 2: 以前有没有人遇到过这样的问题,或者我是唯一一个看到怪物失败的人?没有抛出一个异常,这使得找出问题所在变得更加困难。

【问题讨论】:

  • 你有什么奇怪的$.ajaxSetup()吗?
  • 适用于任何提及的版本:jsfiddle.net/wfc5bqsx
  • 不确定您的代码库有多大,但您是否尝试通过省略其他模块来解决问题,以便获得一个最小的示例?
  • 我正在做一个ajaxSetup 但我不认为有什么问题。 - ` $.ajaxSetup({ beforeSend: function(jqXHR) { if ($.cookie("mycookie") == null) { console.info("会话已过期。调用超时.."); App.timeout() ; 返回 false; } } });`
  • 而且,我试图单独执行它,但没有运气! :(

标签: javascript jquery ajax promise


【解决方案1】:

您能否尝试使用完成/失败,以确保它正常工作:

function getMonster () {
    var theMonster = $.ajax({
      url : "http://codepen.io/chriscoyier/pen/difoC.html",
      success : function(data){
        console.log("Monster Succeeded inside 'success' block");
      }
    });    
    return theMonster;
}

var theMonster = getMonster();
theMonster.done(function(){
    console.log("Moster Succeeded outside");
})
.fail(function(){
    console.log("Monster Failed  :(");
});

并添加“真”:

$.ajaxSetup({
    beforeSend: function(jqXHR) {
        if ($.cookie("mycookie") == null) {
            console.info("Expired Session");
            AppModule.timeout();
            return (false);
        }
        return (true);
    }
});

【讨论】:

  • 你能检查一下XmlHttpRequest是否已经发送了吗?
【解决方案2】:

我花了很长时间调试后发现,ajax 调用的success 块中存在逻辑访问问题。我尝试访问返回 null 的对象的键,并尝试在循环中使用该方法。

我不确定 jQuery 是否应该在那里停止执行,因为它允许链接。我当时找不到解决方案的原因是浏览器控制台没有显示任何错误,只是在循环继续进行特定迭代后停止了执行。

我在脑海中提出的问题是,即使成功块在某些时候失败,jQuery 是否应该继续执行.then() 回调?可能是,可能不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2012-05-09
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多