如何将全局变量newPageToken改为非全局并在函数中正常使用
移除全局
newPageToken的实现方案 核心思路是把分页token作为显式参数在函数调用链中传递,替代全局状态共享,既消除全局变量,也能让分页逻辑的数据流更清晰可追踪。
具体修改点
- 调整
getNextTokenURL:新增入参接收当前分页token,不再读取全局变量,基于传入的token生成对应分页的请求地址 - 调整
getVideoIdsForPageToken:新增入参接收当前分页token,调用URL生成方法时传入该参数,移除对全局状态的依赖;顺手修正原代码中throw语句后console.log永远无法执行的逻辑顺序问题,以及拼写错误Errow - 调整
getPlaylistData:给函数增加默认值为null的分页token入参,拉取第一页时不需要传参,递归请求下一页时直接把接口返回的nextPageToken作为参数传入,彻底去掉对全局变量的赋值操作
修改后的完整代码
// Next page for more results (Max 50 per page) function getNextTokenURL(pageToken) { console.log(pageToken); return pageToken ? `${playlistItemsURL}&playlistId=${extractedPlaylistIDId}&pageToken=${pageToken}&key=${API_KEY}` : `${playlistItemsURL}&playlistId=${extractedPlaylistIDId}&key=${API_KEY}`; } async function getVideoIdsForPageToken(currentPageToken) { try { const { data } = await axios.get(getNextTokenURL(currentPageToken)); const nextPageToken = data.nextPageToken; const videoIds = data.items.map((video) => { return video.contentDetails.videoId; }); return { videoIds, nextPageToken }; } catch (e) { if (e.response) { const { code, message } = e.response.data.error; console.log("Error while fetching videos list."); throw new Error(`StatusCode ${code}. Reason: ${message}`); } else { throw new Error(e.message); } } } // Navigates between the videos per page and adds them (Maximum 50) async function getPlaylistData(pageToken = null) { try { const { videoIds, nextPageToken } = await getVideoIdsForPageToken(pageToken); const returnedVideoIds = []; returnedVideoIds.push(getDetailsForVideoIds(videoIds)); const videoGroups = await Promise.all(returnedVideoIds); for (const group of videoGroups) { for (const video of group) { finalTotalDuration += returnedToSeconds(video.contentDetails.duration); } } if (nextPageToken) { await getPlaylistData(nextPageToken); } } catch (e) { console.log("Error while navigating between video pages."); throw new Error(e.message); } } // 初始调用直接执行即可,无需操作全局变量 // getPlaylistData()
注:原代码中HTML转义字符
&已替换为JS代码中实际使用的&,避免请求地址拼接错误。
内容的提问来源于stack exchange,提问作者Priyam
相关产品推荐
相关产品推荐

