我想解决一个promise,该promise随后会进行ajax调用。无论ajax调用是否成功,都应解决诺言。我尝试了以下代码段:
new Promise(function(resolve, reject) {
$.ajax({
url: "nonExistentURL",
headers: {
"Content-Language": "en"
},
async: true,
type: "DELETE",
contentType: "application/json",
crossDomain: true,
dataType: "json"
}).done(function(oSuccessData) {
debugger;
resolve(oSuccessData);
}).fail(function(oData) {
debugger;
resolve(oData);
});
}).then(function(oData) {
debugger;
}).catch(function(err) {
debugger;
});
但是,这似乎总是进入catch回调。为什么不进入then回调?
答案 0 :(得分:5)
实际上是由于您在fail
回调中收到的参数。它是一个XHR可行承诺类型对象。由于您使用rejected
承诺来解析函数,因此它进入catch
块。
您可以将error
对象包装在另一个对象{ err: oData }
中,然后then
回调将得到正确解决。
new Promise(function(resolve, reject) {
$.ajax({
url: "nonExistentURL",
headers: {
"Content-Language": "en"
},
async: true,
type: "DELETE",
contentType: "application/json",
crossDomain: true,
dataType: "json"
}).done(function(oSuccessData) {
console.log("Done callback: Resolving the promise with Data");
resolve(oSuccessData);
}).fail(function(oErr) {
console.log("Fail callback: Resolving the error");
resolve({ err: oErr });
});
}
).then(function(oData) {
console.log("Then Callback");
}).catch(function(err) {
console.log("Catch the error");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>