You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native首次开发遇func.apply is not a function错误求助

问题分析与解决方案

首先咱们直接揪出代码里的核心问题:你把Promise对象直接传给了setTimeout的第一个参数,但setTimeout要求第一个参数必须是可执行的函数,这就是多次点击后抛出func.apply is not a function错误的根本原因。

具体错误点拆解

  1. Promise误用:response.text()返回的是一个Promise对象,你调用object.then(...)后得到的还是Promise,却把这个Promise直接丢给setTimeout当回调。定时器触发时会尝试把Promise当作函数执行,自然会触发“不是函数”的错误。
  2. 全局变量污染:url和object都没加let/const声明,会变成全局变量,多次点击按钮时会覆盖之前的Promise实例,进一步加剧异常概率。
  3. 多余的无效判断:response.text()永远会返回Promise,不可能是undefined,这个判断完全没必要。

修正后的代码

如果你的setTimeout是业务需要的延迟处理逻辑,正确写法是把Promise的处理放进setTimeout的回调函数中:

update_signals = () => {
  // 用const声明变量,避免全局污染
  const url = `${this.state.url}action=get_signals`;
  fetch(url)
    .then((response) => {
      // 将Promise处理逻辑包裹进定时器的箭头函数
      setTimeout(() => {
        response.text()
          .then((text) => {
            this.get_signals_form_response(text);
          })
          .catch((error) => {
            alert(`获取响应文本出错: ${error.message}`);
          });
      }, 10000);
    })
    .catch((error) => {
      alert(`请求总出错: ${error.message}`);
    });
};

如果其实不需要延迟,完全可以去掉setTimeout,让Promise正常链式调用:

update_signals = () => {
  const url = `${this.state.url}action=get_signals`;
  fetch(url)
    .then((response) => response.text())
    .then((text) => {
      this.get_signals_form_response(text);
    })
    .catch((error) => {
      alert(`错误: ${error.message}`);
    });
};

为什么这样改就没问题?

  • setTimeout的第一个参数现在是箭头函数,定时器触发时会执行这个函数,再在内部处理Promise逻辑,完全符合setTimeout的参数要求。
  • 用const声明变量,避免了全局变量的覆盖问题,每次点击都会创建独立的局部变量。
  • 简化了Promise链式调用,逻辑更清晰,Promise自带的.catch()也能准确捕获所有异步环节的错误(这也是你之前加try-catch没用的原因:错误发生在宏任务的定时器回调里,同步try-catch抓不到)。

内容的提问来源于stack exchange,提问作者amirhosein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:17:06