解决另一个承诺失败的内部承诺

时间:2019-03-13 07:05:06

标签: javascript jquery ajax promise

我想解决一个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回调?

1 个答案:

答案 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>