Javascript 而异步内的循环等待
我有一些通过网络调用不断更新一系列对象的代码,如下所示。我想知道这是否是一个坏习惯,是否有更好的方法。我不能使用设置间隔,因为Javascript 而异步内的循环等待,javascript,node.js,async-await,Javascript,Node.js,Async Await,我有一些通过网络调用不断更新一系列对象的代码,如下所示。我想知道这是否是一个坏习惯,是否有更好的方法。我不能使用设置间隔,因为MakeAsyncCall回复之间的时间是可变的,如果进行调用的时间长于延迟,则可能导致泄漏。我将使用此信息更新UI。这会导致阻塞吗?你的想法是什么?如果你需要更多信息,请告诉我 let group = [item1, item2, item3]; // Start Loop readForever(group, 100); // Function to Delay
MakeAsyncCall
回复之间的时间是可变的,如果进行调用的时间长于延迟,则可能导致泄漏。我将使用此信息更新UI。这会导致阻塞吗?你的想法是什么?如果你需要更多信息,请告诉我
let group = [item1, item2, item3];
// Start Loop
readForever(group, 100);
// Function to Delay X ms
const delay = ms => {
return new Promise((resolve, _) => {
const timeout = setTimeout(() => {
resolve();
}, ms);
});
};
// Function to continuously Make Calls
const readForever = async (group, ms) => {
while(true) {
// Make Async Call
for (let item of group) {
await MakeAsyncCall(item);
}
// Wait X ms Before Processing Continues
await delay(ms);
}
};
给定的代码不会导致任何UI阻塞。并且是持续更新UI的有效方法 您可以这样编写,而不是循环:
const readForever = async (group, ms) => {
// Make Async Call
for (let item of group) {
await MakeAsyncCall(item);
}
// Wait X ms Before Processing Continues
await delay(ms);
if (true) { // not needed, but there you could define an end condition
return readForever(group, ms);
}
};
除了关于延迟功能的注释外:
您可以直接将resolve
传递到setTimeout
,因为您不需要将结果setTimeout
存储在变量中的任何位置取消超时
const delay = ms => {
return new Promise(resolve => setTimeout(resolve, ms));
};
令人惊叹的。你还有其他可能的方法吗。可以说,我喜欢学习剥猫皮的新方法。@canaanseaton添加了另一种方法。如果引擎不支持尾部调用优化,递归解决方案可能会导致堆栈溢出。另外,延迟可以写成const delay=ms=>new Promise(resolve=>setTimeout(resolve,ms))代码>