【问题标题】:jQuery 3.1.0 then(), done() and when() error swallowingjQuery 3.1.0 then()、done() 和 when() 错误吞咽
【发布时间】:2021-01-19 05:06:03
【问题描述】:

使用 jQuery 3.1.0,我正在创建未知数量的 $.ajax() 请求,并将生成的 promise(s) 添加到数组中:

myArray.push($.ajax(...).promise());

完成所有请求后,我想调用一个函数,据我所知可以使用:

$.when.apply($, myArray).then(myFunction, errorHandlingFunction);

但是,myFunction 抛出了一个被 jQuery 吞噬的错误(在测试期间,我的所有函数都调用了 throw new Error())。我可以看到调用mightThrow() 后执行进入catch 并正确拒绝了延迟,但这从未在控制台中显示。

即使执行以下省略了 apply 调用的操作,也会导致错误被完全吞没;调试器行也永远不会被命中:

myArray[0].then(function() {
    throw new Error('test error');
}, function() { debugger; });

删除when() 并执行以下操作会导致执行中断:

myArray[0].done(() => {
    throw new Error('test error');
}).fail(function(){ debugger; });

似乎then()执行的函数中出现的错误总是被吞掉。另外,$.when(...).done(...)如果done()里面的函数抛出,也会导致错误被吞掉。

我是否误解了什么或者这是 jQuery 的错误/功能?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您需要使用.then(myFunction).fail(myErrorHandling)。在myFunction 中抛出错误将拒绝then() 创建的新承诺,然后可以在fail() 中处理。

.then(myFunction, myErrorHandling) 中的错误处理函数在then() 收到的promise 被拒绝时被调用。仅当您来自 $.when() 的至少一个 ajax 请求失败时才会出现这种情况。

【讨论】:

【解决方案2】:

对于 Promises,您应该使用 .catch(function(error){}) 或 JQuery .fail(function(error){}),.then 仅在成功时调用,因此如果它抛出错误,您将看不到它。

Javascript:

myArray[0].then(function() {
    console.log('I am a success');
}).catch(function(error){
    console.error('I am an error', error);
});

JQuery:

myArray[0].done(function() {
        console.log('I am a success');
    }).fail(function(error){
        console.error('I am an error', error);
    });

干杯

【讨论】:

  • 当在您的第二个示例中,console.log() 调用引发错误时,问题就会显现出来。这会悄无声息地发生。
  • 这不是真的,只是尝试了两个示例并抛出错误:Javascript:new Promise(function(resolve){ resolve(); }).then(function() { throw new Error('test error'); }, function() { debugger; }); JQuery:$.ajax({method: 'get',url: 'http://swapi.co/api/planets/1/'}).promise().done(function(){throw new Error('test error');});。如果错误没有抛出给你,则说明还有其他问题。
  • 在最后一个示例中,将 .done() 更改为 then() 或尝试将承诺包装在 $.when() 中。这导致我的问题得到了解答。
  • 两种情况都试过了,它一直正确抛出错误,很高兴你找到了你想要的答案。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 2017-01-26
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多