【发布时间】:2021-12-28 13:14:15
【问题描述】:
我在主函数中使用了 await 关键字来等待对 poll() 的异步函数调用完成,但对 my_plot 的函数调用是在 poll() 函数完成之前进行的。
async function main() {
getParametersData()
await poll()
my_plot()
}
async function getData() {
const response = await fetch(API)
const message = await response.json()
return message
}
async function poll(count = 1) {
console.log(`Polling ${count}`);
try {
const data = await getData();
if (data && Object.keys(data).length !== 0) {
console.log("Poll", data)
return;
} else {
setTimeout(poll, 5000, ++count);
}
}
catch (err) {
console.log(`${err}. Polling again in 5 seconds.`);
setTimeout(poll, 5000, 1);
}
}
async function my_plot() {
console.log("my plot")
}
代码输出:
Polling 1
my plot
Polling 2
Polling 3
Poll [1,2,3]
预期:
Polling 1
Polling 2
Polling 3
Poll [1,2,3]
my plot
【问题讨论】:
-
什么是
getData()? -
@Dai 更新了代码
-
setTimeout的运作方式与您想象的不同。它会导致您的poll方法的后续/递归调用异步执行,这就是您看到此行为的原因。这在associated MDN page 上有非常清楚的记录。 -
setTimeout将启动一个新任务,您不能直接等待。您需要创建一个 Promise 并在超时回调中解决它,以便它的行为像您想要的那样。见How to make a promise from setTimeout。 -
@esqew 还有其他方法可以完成我想做的事情吗?任何帮助或建议将不胜感激