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 错误时捕获“未捕获(在承诺中)”

Youtube API未捕获(在承诺中)错误:请求失败,状态码为403

未捕获(承诺):错误:没有 AngularFireAuth 的提供者