Javascript 承诺在没有错误时捕获块启动
Posted
技术标签:
【中文标题】Javascript 承诺在没有错误时捕获块启动【英文标题】:Javascript promises catch block initiating when no error 【发布时间】:2022-01-23 08:39:46 【问题描述】:我创建了一个调用如下所示 api 的函数。我在前端显示来自 setMessage 的消息。由于某种原因,当没有错误时,.catch 块消息在 setMessage() 中闪烁,然后 setMessage() 最终以来自 .then() 的正确消息结束。
我不确定这是为什么。
function handleCoupon(e)
e.preventDefault();
setMessage("");
setLoading(true);
fetch(`$process.env.NEXT_PUBLIC_SERVER_API/subscription/coupon/get`,
method: "POST",
body: JSON.stringify(
appliedCoupon: couponCode.toLowerCase().trim(),
),
headers:
"Content-Type": "application/json",
,
)
.then((response) => response.json())
.then((data) =>
console.log(data);
if (data.coupon === true)
setMessage(data.message);
setLoading(false);
else
setMessage(data.message);
setLoading(false);
)
.catch(
(error) => console.log(error.message),
setMessage("Something went wrong, please contact support")
);
【问题讨论】:
你是在useEffect
钩子里面做这个吗?如果是这样,您是否为useEffect
设置了默认值,这样它就不会重复运行?
使用逗号操作符很讨厌。我个人不确定如何在箭头函数中解析它。尝试将其更改为.catch((error) => console.log(error); setMessage('....') )
。
... 当然,将语句正确格式化为两行。我只是写了以上内容以适应评论部分
@RandyCasburn,不,它是通过点击按钮调用的。
@slebetman 你是说它可能因为逗号而无法正常工作并且应该是分号?
【参考方案1】:
.catch 只接受 single 函数作为参数,而您要传递其中的 2 个:
(error) => console.log(error.message)
setMessage("Something went wrong, please contact support")
尝试将它们合并为 1 个函数,例如
.catch((error) =>
console.log(error.message);
setMessage("Something went wrong, please contact support");
);
【讨论】:
太棒了,它成功了!谢谢,感谢您的帮助!以上是关于Javascript 承诺在没有错误时捕获块启动的主要内容,如果未能解决你的问题,请参考以下文章
ERROR 错误:未捕获(承诺中):MyPlugin 没有 Web 实现
未捕获(在承诺中)错误:提供的权重数据没有目标变量:block1_conv1_2 / kernel
vue-resource:在拦截 ajax 错误时捕获“未捕获(在承诺中)”