使用 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 时拒绝承诺 [重复]的主要内容,如果未能解决你的问题,请参考以下文章