【问题标题】:Rejecting promise when using fetch [duplicate]使用 fetch 时拒绝承诺 [重复]
【发布时间】:2016-03-11 00:51:47
【问题描述】:

我对如何正确使用 fetch 有点困惑。即使我得到错误状态,它似乎也能解决。下面的代码是否正确(将 fetch 包装在另一个 promise 中)?

function a(url, config) {
  if (!config)
    config = {};

  config = Object.assign(config, {
    headers: {
      'content-type': 'application/json;charset=utf-8'
    }
  })
  return new Promise(
    function(resolve, reject) {
      fetch(url, config).then(
        function(res) {
          if (res.status == 200 && res.ok) {
            console.log("Promise resolved")
            resolve(res);
            return;
          }
          console.log("Promise rejected")
          reject(res);
        },
        function(rej) {
          console.log("promise rejected")
          reject(rej);
        }
      )
    }
  )
}

function b() {
  a('/test').then(
    function(res) {
      console.log('success');
      console.log(res)
    },
    function(rej) {
      console.log('Rejected');
      console.log(rej)
    }
  )
}

b();
(上面的代码应该通过控制台在 chrome 中运行良好......只需复制/粘贴)

【问题讨论】:

  • 如果 fetch 是所有现代浏览器中都存在的 fetch,那么正如您清楚地知道的那样,它会返回一个 Promise。所以没必要把它包装在一个promise中,它只会让事情变得混乱
  • 实际上...即使出现 400 之类的错误状态,它也能解决。因此,如果我想让被调用者知道它有一个错误代码...我需要包装并拒绝如果它不是 ok/200 .虽然......目前......上面的代码按预期工作(b运行拒绝)......我正在查看我的代码以尝试重写上面的代码以匹配它。无论哪种方式,以上只是一个示例,而 fetch 正是我可以用来创建易于演示的 Promise 的方法。
  • 看起来不错,使用此代码您会得到“Promise denied”、“Rejected”。正如预期的那样。不清楚是什么问题。
  • 是的,对不起,我试着写一个简单的例子,实际上这个例子是有效的。我正在查看我的应用程序代码以尝试使其立即匹配。
  • @JaromandaX 再次......我怎样才能做到这一点并拒绝任何不是 200 的东西?默认情况下,如果不是 200,则 fetch 不会拒绝。当我使用 fetch 时,我希望 resolve 返回我可以使用的东西。目前,我什至无法重新创建我所看到的内容,但我的代码似乎在我的应用程序中按预期工作。还在研究中

标签: javascript angularjs ecmascript-6 fetch-api


【解决方案1】:

如果你想拒绝成功回调,你需要通过返回被拒绝的承诺来明确地做到这一点,例如return Promise.reject('error occurred'); 或投掷。

此外,你不应该在你的情况下滥用Promise构造函数,因为fetch已经返回了promise对象:

function a(url, config) {
    if (!config)
        config = {};

    config = Object.assign(config, {
        headers: {
            'content-type': 'application/json;charset=utf-8'
        }
    });

    return fetch(url, config).then(
        function(res) {
            if (res.status == 200 && res.ok) {
                console.log("Promise resolved")
                return res.json();
            }
            console.log("Promise rejected");
            throw 'promise rejected';
        },
        function(rej) {
            console.log("promise rejected");
            throw 'promise rejected';
        }
    );
}

【讨论】:

  • 我无法删除问题,因为代码实际上按预期工作 =/。感谢您对投掷的建议,而不是我正在做的事情。
猜你喜欢
  • 2019-11-02
  • 2019-05-21
  • 2018-07-20
  • 2020-06-06
  • 2013-11-04
  • 1970-01-01
  • 2019-11-25
  • 2015-06-10
相关资源
最近更新 更多