使用fetch时拒绝承诺

Gob*_*ord 6 javascript angularjs ecmascript-6 fetch-api

我对如何正确使用fetch感到困惑.即使我收到错误状态,它似乎也解决了.以下代码是否正确(将获取包装在另一个承诺中)?

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();
Run Code Online (Sandbox Code Playgroud)
(以上代码应该通过控制台在chrome中正常运行...只需复制/粘贴)

dfs*_*fsq 2

如果您想从成功回调中拒绝,您需要通过返回被拒绝的承诺(例如,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';
        }
    );
}
Run Code Online (Sandbox Code Playgroud)