如何使用Twitter API嵌入推文JS工厂函数处理不可用推文
实现方案
你当前无法完成统计的核心原因有两个:
- 你是循环逐个调用
createTweet方法,没有统一收集所有调用的返回状态做聚合统计 - 你把关闭加载遮罩的逻辑写在了单个请求的回调中,只要第一个请求返回就会触发定时关闭,此时其余请求可能还未返回,根本拿不到完整的统计结果
按照以下步骤修改即可实现需求:
- 初始化两个计数器,分别记录加载成功的有效推文数、无法访问的无效推文数
- 遍历所有待加载的帖子ID时,把每个
createTweet返回的Promise统一收集到数组中,不要在单个请求的回调里处理全局逻辑 - 单个Promise状态落定的时候就判断返回值,对应累加有效/无效计数,请求触发catch异常的场景统一归为无效推文
- 用
Promise.all等待所有推文加载请求全部处理完成后,再关闭加载遮罩,根据统计结果给用户展示对应提示:如果无效数等于总推文数,就告知用户所有内容均不可用;如果存在部分无效,就提示跳过的无效推文数量
参考实现代码:
// 初始化统计变量 let validCount = 0; let invalidCount = 0; const loadTaskList = []; const tweetContainer = document.getElementById(twitter_area); // 遍历所有待加载的推文ID post_id_list.forEach(postItem => { const task = twttr.widgets.createTweet( postItem.post_id, tweetContainer, {} ).then(el => { // 单条推文加载完成后更新计数 el === undefined ? invalidCount++ : validCount++; }).catch(err => { // 接口报错、网络异常等场景统一记为无效推文 invalidCount++; console.error('单条推文加载异常', err); }); loadTaskList.push(task); }); // 等待所有加载任务完成 Promise.all(loadTaskList).then(() => { // 所有请求处理完成后再关闭遮罩 hideOverlay(); // 根据统计结果展示提示 if (invalidCount === post_id_list.length) { alert('当前列表内的所有推文均不可访问(可能已被删除、发布者设为私密账号),暂无有效内容展示'); return; } if (invalidCount > 0) { alert(`已为您跳过${invalidCount}条不可访问的推文`); } });
注意:不建议在单个请求的回调里设置固定5秒定时关闭遮罩,弱网环境下很容易出现部分请求还未返回就提前关闭加载态的问题,会导致统计结果不准确。如果需要做超时兜底,可以给整个批量加载逻辑加全局超时判断即可。
内容的提问来源于stack exchange,提问作者Mickey Vershbow
相关产品推荐
相关产品推荐

