首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用异步/等待是接收来自Promise.reject()的解析承诺的唯一方式吗?

使用异步/等待是接收来自Promise.reject()的解析承诺的唯一方式吗?
EN

Stack Overflow用户
提问于 2018-12-14 23:25:56
回答 2查看 63关注 0票数 0

我有下面的代码。我想做的是分别处理网络错误案例和返回的HTTP服务器错误案例。

代码语言:javascript
运行
复制
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()的promise后才返回它。通过像这样添加异步/等待,我成功地收到了一个已解析的承诺:

代码语言:javascript
运行
复制
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);
      });

这是达到我目标的唯一途径吗?

我也尝试过这样做:

代码语言:javascript
运行
复制
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);
      })

但最终的console.log总是被调用,即使当我在上面的代码中调用Promise.resolve()时也是如此,因为它附加在从fetch函数本身的promise上。你知道为什么会这样吗。

EN

回答 2

Stack Overflow用户

发布于 2018-12-14 23:27:59

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

代码语言:javascript
运行
复制
return response.text().then(text => Promise.reject(text));
票数 2
EN

Stack Overflow用户

发布于 2018-12-14 23:50:42

那么这个版本呢:

代码语言:javascript
运行
复制
const options = {
  method: 'POST',
  mode: 'same-origin',
  cache: 'no-store',
  credentials: 'same-origin',
  referrer: 'origin',
  body: formData
}

async function parseResponse (response) {
  try {
    success(await response.json())
  } catch () {
    failure(await response.text())
  }
}

function parseError (err) {
  failure(`Error uploading file: ${err}`)
}

fetch('$imageUploadUrl', options)
  .then(parseResponse)
  .catch(parseError)
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53782566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档