我最近在与jQuery AJAX调用和承诺相关的代码中遇到了一个微妙的错误。简而言之,代码所做的相当于:
Promise
.resolve($.ajax(...))
.catch(function(err){return err})
.then(function(response){//do something with response}
这样做的原因现在并不重要,当然还有很多其他部分未列出的承诺链与这个问题无关。我想要发生的是AJAX调用的拒绝原因,最终解决了已解决的路径,但每次都重新拒绝。
我最终发现从被拒绝的jQuery AJAX调用返回的响应有一个then方法,它将自己拒绝作为原因。要明确:
Promise.resolve($.ajax(...)) //an ajax call which will reject
.catch(function(err){
err.then(null,function(err2){
if (err===err2) console.log("AJAX error rejects with itself as a reason!");
});
});
将记录控制台上给出的消息。
我的问题是为什么要这样做?退回的理由是否有充分理由拒绝承诺本身?还有一个很好的理由,这个因为理由应该拒绝吗?
为避免混淆,下面是第二个代码块,重写为使用与第一个块相同的链式样式和外部变量来存储返回的错误。
var reason;
Promise
.resolve($.ajax(...))
.catch(function(err){
reason=err;
return err
})
.then(function(response){//will not be called if the ajax rejects}
.catch(function(err){
if (err===reason) console.log("AJAX error rejects with itself as a reason!");
})
答案 0 :(得分:0)
你的承诺是错误的,因为Promise的回报会在itsef中解决并拒绝;
当你这样做时
Promise.resolve($.ajax(...)) //an ajax call which will reject
.catch(function(err){
err.catch(function(err2){
if (err===err2) console.log("AJAX error rejects with itself as a reason!");
});
});
你解决了jquery ajax调用的任何结果,它总能正常工作你没有