【发布时间】:2021-07-29 20:43:50
【问题描述】:
我有一个包含一些值的数组,这些值应该作为参数传递给 api 调用。 我想用 api 调用的结果更新数据。我想用数组的每个值每 1 秒调用一次 api。
示例:
const people = [1, 2, 3, 4, 5];
people.forEach((person, index) => {
setTimeout(() => {
fetch(`https://swapi.dev/api/people/${person}/`)
.then(res => res.json())
.then(data => {
// do stuff, eg : update UI
console.log(data.name);
})
}, index * 1000);
});
由于我想继续调用 api 并不断更新数据或 UI,因此将 forEach() 包装在无限循环中是个好主意,如下所示:
while(true) {
people.forEach((person, index) => {
setTimeout(() => {
fetch(`https://swapi.dev/api/people/${person}/`)
.then(res => res.json())
.then(data => {
// do stuff, eg : update UI
console.log(data.name) ;
})
}, index * 1000);
}) ;
} ;
如果这是一个坏主意,请说明原因并建议其他方法来做正确的事。 提前致谢。
更多信息:- 我要使用的 api 的速率限制为每 5 秒 100 次 api 调用,所以我必须每 3 秒调用一次以保持实时而不达到限制。
每个数组元素都是不同的端点,因此需要对其进行完全迭代以尽可能保持数据的实时性。
此脚本应该 24/7 运行以更新数据
starwars api 仅用作示例,因为这是我想到的第一个。
【问题讨论】:
-
这是一个非常糟糕的主意,因为 while 循环迭代不会等待超时。您将以这种方式每秒安排数千次超时。您可以使用外部间隔,使循环每 5 秒运行一次(快速但不好的修复),或使用交错间隔。
-
你能解释一下吗?
-
我建议至少做一个
setInterval()而不是一段时间。您的 api 可以更改为接受任意数量的人,而不是一次只接受一个人吗?他们的数据多久更改一次? -
我的意思是这样的:jsfiddle.net/zj19g6pk
-
你看我的小提琴了吗?我将调用移至一个函数,并在初始循环中专门调用它以防止延迟。