首页 > 解决方案 > 使用 async/await 是从 Promise.reject() 接收已解决承诺的唯一方法吗?

问题描述

我在下面有以下代码。我要做的是分别处理网络错误情况和返回的HTTP服务器错误情况。

fetch("$imageUploadUrl", {
          method: "POST",
          mode: "same-origin",
          cache: "no-store",
          credentials: "same-origin",
          redirect: "error",
          referrer: "origin",
          body: formData
      }).catch(function(error) {
        failure("There was an error while uploading the image");
      }).then(function(response) {
          if (response.ok){
            return Promise.resolve(response.json());
        } else {
            return Promise.reject(response.text())
        }
      }).then(function(result) {
        success(result.location);
      }).catch(function(errorText) {
          return failure (errorText);
      })

然而,与Promise.resolve(),不同的是,在返回它之前Promise.reject()不会等待解决承诺。response.text()通过像这样添加 async/await,我设法收到了一个已解决的承诺:

fetch("$imageUploadUrl", {
          method: "POST",
          mode: "same-origin",
          cache: "no-store",
          credentials: "same-origin",
          redirect: "error",
          referrer: "origin",
          body: formData
      }).catch(function(error) {
        failure("There was an error while uploading the image");
      }).then(async function(response) {
          if (response.ok){
            return Promise.resolve(response.json());
        } else {
            return Promise.reject(await response.text())
        }
      }).then(function(result) {
        success(result.location);
      }).catch(function(errorText) {
          failure(errorText);
      });

这是达到我目标的唯一方法吗?

我也试过这样做:

fetch("$imageUploadUrl", {
          method: "POST",
          mode: "same-origin",
          cache: "no-store",
          credentials: "same-origin",
          redirect: "error",
          referrer: "origin",
          body: formData
      }).catch(function(error) {
        failure("There was an error while uploading the image");
      }).then(function(response) {
          if (response.ok){
            return Promise.resolve(response.json());
        } else {
            return Promise.reject(response.text())
        }
      }).then(function(result) {
        success(result.location);
      }).catch(function(textPromise) {
          return textPromise;
      }).then(function(text) {
        console.log(text);
      })

但是最后一个 thenconsole.log总是被调用,即使我调用Promise.resolve()它上面的代码,因为它附加在 fetch 函数本身的 promise 上。你知道为什么会这样吗?

标签: javascriptpromise

解决方案


您可以等待承诺,然后拒绝它:

return response.text().then(text => Promise.reject(text));

推荐阅读