使用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的错误/功能?
答案 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);
});
干杯