使用 fetch 时拒绝承诺 [重复]

Posted

技术标签:

【中文标题】使用 fetch 时拒绝承诺 [重复]【英文标题】:Rejecting promise when using fetch [duplicate] 【发布时间】: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 返回我可以使用的东西。目前,我什至无法重新创建我所看到的内容,但我的代码似乎在我的应用程序中按预期工作。还在研究中 【参考方案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';
        
    );

【讨论】:

我无法删除问题,因为代码实际上按预期工作 =/。感谢您对投掷的建议,而不是我正在做的事情。

以上是关于使用 fetch 时拒绝承诺 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

处理多个承诺拒绝[重复]

等待但从未解决/拒绝承诺内存使用[重复]

重复执行时未处理的承诺拒绝

稍后赶上承诺拒绝[重复]

mongoose 的重复键错误处理和未处理的承诺拒绝

使用 bulkDelete 时承诺拒绝错误