jQuery 3.1.0 then(),done()和when()吞咽错误

时间:2016-09-13 09:31:33

标签: javascript jquery

使用jQuery 3.1.0,我创建了一个未知数量的$.ajax()个请求,并使用以下方法将生成的promise添加到数组中:

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

一旦完成所有请求,我想调用一个函数,我理解可以使用:

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

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

即使执行以下操作,省略了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的错误/功能?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:-1)

对于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);
    });

干杯