React Native首次开发遇func.apply is not a function错误求助
问题分析与解决方案
首先咱们直接揪出代码里的核心问题:你把Promise对象直接传给了setTimeout的第一个参数,但setTimeout要求第一个参数必须是可执行的函数,这就是多次点击后抛出func.apply is not a function错误的根本原因。
具体错误点拆解
- Promise误用:
response.text()返回的是一个Promise对象,你调用object.then(...)后得到的还是Promise,却把这个Promise直接丢给setTimeout当回调。定时器触发时会尝试把Promise当作函数执行,自然会触发“不是函数”的错误。 - 全局变量污染:
url和object都没加let/const声明,会变成全局变量,多次点击按钮时会覆盖之前的Promise实例,进一步加剧异常概率。 - 多余的无效判断:
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
相关产品推荐
相关产品推荐

