点击图标触发onPressed函数时出现setInterval相关未定义函数错误求助
我看到你的问题了,这个错误的根源是你把setInterval当成了Promise的链式方法来调用,但实际上setInterval是全局API,不能直接跟在.then()后面,这就导致了"undefined is not a function"的报错。咱们一步步来修正:
首先,梳理核心问题
- 语法错误:你的第一个
fetch的.then()后面多了一个多余的}),这会直接导致语法解析失败。 - 错误的链式调用:
setInterval不是Promise对象的方法,不能挂在.then()的返回值后面,这是报错的直接原因。 - 异步
setState的坑:setState是异步操作,你在设置channelId后马上用this.state.channelId拼接URL,大概率拿到的还是旧值。 - Promise处理不完整:
response.json()返回的是Promise,直接传给updateSubscribers会导致函数拿到的不是最终数据。
修正后的完整代码
1. 修复onPressedButton函数
onPressedButton = channelId => { // 直接使用传入的channelId,避开异步setState的取值问题 this.setState({ channelId }); // 用参数channelId拼接URL,不依赖state的异步更新 const initialUrl = `https://www.googleapis.com/youtube/v3/channels?key=${API_key}&id=${channelId}&part=snippet,contentDetails,statistics`; this.setState({ url: initialUrl }); fetch(initialUrl, { method: 'GET' }) .then(response => response.json()) .then(data => { // 这里可以处理首次请求返回的数据,比如之前注释的fetchData(data) // fetchData(data); alert('calling2'); // 在首次请求成功后启动定时器,注意保存定时器ID用于后续清理 const intervalId = setInterval(() => { const statsUrl = `https://www.googleapis.com/youtube/v3/channels?key=${API_key}&id=${channelId}&part=statistics`; fetch(statsUrl, { method: 'GET' }) .then(response => response.json()) .then(statsData => updateSubscribers(statsData)) // 正确处理json的Promise结果 .catch(error => console.log('Stats fetch error:', error)); }, 5000); // 建议设置合理间隔(比如5秒),0会疯狂请求触发API限流 // 把定时器ID存在state,方便组件卸载时清理 this.setState({ intervalId }); }) .catch(error => { console.log('Initial fetch error:', error); }); }
2. 修复Icon的onPress逻辑
同样避开setState的异步问题,直接使用计算后的新值:
<Icon style={styles.icon} name='search' type='material' color='black' onPress={() => { const newChannelId = this.getChannelId(this.state.term); this.setState({ channelId: newChannelId }); obj.onPressedButton(newChannelId); // 直接用计算好的值,不用等setState完成 }} />
额外注意事项
- 清理定时器:在类组件的
componentWillUnmount生命周期里加上clearInterval(this.state.intervalId),防止组件卸载后定时器仍在运行导致内存泄漏。 - API限流:YouTube API有请求频率限制,不要把间隔设为0,否则很快会被限流,建议至少设为5秒以上。
内容的提问来源于stack exchange,提问作者Darshan
相关产品推荐
相关产品推荐

