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

点击图标触发onPressed函数时出现setInterval相关未定义函数错误求助

我看到你的问题了,这个错误的根源是你把setInterval当成了Promise的链式方法来调用,但实际上setInterval是全局API,不能直接跟在.then()后面,这就导致了"undefined is not a function"的报错。咱们一步步来修正:

首先,梳理核心问题

  1. 语法错误:你的第一个fetch的.then()后面多了一个多余的}),这会直接导致语法解析失败。
  2. 错误的链式调用:setInterval不是Promise对象的方法,不能挂在.then()的返回值后面,这是报错的直接原因。
  3. 异步setState的坑:setState是异步操作,你在设置channelId后马上用this.state.channelId拼接URL,大概率拿到的还是旧值。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:01