我有一个for of
循环:
for (const element of $array) {
let my_value = await GM.getValue("my_value");
}
工作良好。
现在,当my_value
为而不是为空时,我只想进入下一个循环迭代。如果它是空的,我希望它在进入下一个迭代之前等待my_value
有内容。
到目前为止,我已经尝试了do..while
方法:
for (const element of $array) {
do {
let my_value = await GM.getValue("my_value");
if (my_value) continue;
} while (0);
}
但它不起作用。
正确的方法是什么?
这里的简单答案是不应该再做什么了,因为GM.getValue
应该只在有值要返回时才解析它的promise。你不应该需要对该方法进行轮询;等待";让它做出回应。
让我用一个模型来说明这一点。在本例中,我的getValue
方法在短延迟后解析。这模拟了它做一些工作(也许从数据库加载一些数据,或者从第三方系统接收一些数据——这无关紧要(。我的循环只在发生该操作后继续
const GM = {
getValue: function(input) {
return new Promise(resolve => setTimeout(resolve,2000, input))
}
}
const $array = [1,2,3,4,5];
(async () => {
for (const element of $array) {
let my_value = await GM.getValue("my_value");
console.log(element, my_value);
}
})()
基于以上评论的讨论,我们可以说基于您的代码不需要做while和嵌套循环,您只能通过控制async/await
来处理它。。。我设置了一个中断循环的条件,并使等待行为。。。
当循环通过async/awais
启动时,它会做什么?循环将等待承诺,你可以做你需要做的…
const sleep = ms => {
return new Promise(resolve => setTimeout(resolve, ms))
}
const forLoop = async () => {
let loop = true;
for (const variable of [1, 2, 3, 4, 5]) {
await sleep(1000);// Wait
console.log(variable * 2, "DoWhile");// Then do somthing
// Break when you need and base any condition...
if(variable * 2 === 6){
break;
}
console.log(variable, "above")
}
}
forLoop()
https://jsfiddle.net/75o3xh2a/