【发布时间】:2019-06-11 22:44:49
【问题描述】:
我有两个 API 请求,一个每 5000 毫秒调用一次,一个每 30000 毫秒调用一次。我想确保在向服务器发出新请求之前完成每个调用。我不希望任何一个请求相互重叠。例如,如果 func1 API 尚未完成,那么我不想在完成之前发出 func2 API 调用。
这是我迄今为止尝试过的。
async function vals() {
try {
await func1()
.then(response => response.json())
.then(result => display_result(result))
.catch(error => console.error('Error: ', error));
await func2()
.then(response => response.json())
.then(result => display_result(result))
.catch(error => console.error('Error: ', error));
}
catch(error) {
return error;
}
}
vals();
这里是func1和func2。
function func1() {
return setInterval(() => fetch(url, { method: 'GET' }), 5000);
}
function func2() {
return setInterval(() => fetch(url, { method: 'GET' }), 30000);
}
我希望它首先运行 func1(),等待它解决,然后运行 func2()。相反,func1() 被调用了两次,并且永远不会到达 func2()。是否应该在 vals() 函数中设置 setIntervals?任何指导来完成这项工作将不胜感激。
【问题讨论】:
-
如何使用
Promise.all,当所有作为迭代传递的承诺都已解决时,它会解决。 -
如果您的 API 可以容忍两个请求同时发生 不频繁 发生,那么有一个非常简单的解决方案适合您:确保超时延迟没有小的共同点-多!
5000ms和30000ms循环将在每个30000ms中重合,但5000ms和29000ms循环重合的频率要低得多。更好的是,将任一循环的初始化偏移2500ms- 这样循环将永远不会在时间上重合。 -
我更新了我的问题。我需要来自 func1 或 func2 的每个 API 调用按顺序运行。 Promise.all 并行运行所有的 Promise。
-
您通常不会在 async 函数中使用
then。您应该简单地等待结果值并使用它们。还有setIntervaldoesn't return a promise,所以等待结果会立即解决。 -
您考虑过使用自定义事件吗?使用事件的原因在于它们的工作方式。如果在触发具有相同签名的另一个事件时正在执行事件处理程序,则第一个事件将始终在下一个事件回调执行之前执行到完成。这是一种确保一个任务在第一个任务完成之前不会启动的简单方法(如果任务、事件处理程序相同)。