我有两个这样的数组:
var array1 = ["apple", "pear", "cherry", "orange", "mango"];
var array2 = [false, false, false, false, false];
当我浏览array1
时,我会修改其中的一些元素。我将array2
中的各个元素转换为true。例如,如果array1
变为
["apple", "pearX", "cherry", "orange", "mango"]
array2
变为:
[false, true, false, false, false]
我不再修改"pearX"
,因为array2
中的情况属实。当array1
变为全部array2
时,我应该停止修改true
。此外,我无法一次修改所有array1
,因为"apple"
的值可能取决于"pear"
&#39>
为了解决这个问题,首先我做了一个for循环并把它放在一个像这样的while循环中:
var isComplete = false
while(isComplete == false)
{
for(var i = 0; i < array1.length; i++)
{
// do some stuff
if(/*all elements in array2 is true*/)
{
isComplete = true;
break;
}
}
}
这没有用,因为for循环试图一次修改所有元素,它不等待其他元素&#39;要改变的价值。它正在异步修改所有array1
个元素。
然后我用array.forEach替换了循环。但它没有用,因为我无法找到一个合适的方法来停止forEeach循环。
正如你所看到的,这个问题不是火箭科学,但由于我是Javascript编程的新手,我自己无法解决这个问题。你能帮我找到解决这个问题的有效方法吗?感谢。
答案 0 :(得分:2)
要解决此类问题,我认为最好使用promises,您希望同步多个异步更改,使用promises很容易找到所有更改完成后。
请参阅以下代码段
var array1 = ["apple", "pear", "cherry", "orange", "mango"];
var array2 = [false, false, false, false, false];
var promises = [];
for (let i = 0; i < array1.length; i++) {
let p = new Promise(function(resolve, reject) {
setTimeout(function() {
array1[i] += "X";
array2[i] = true;
resolve(array1[i]);
}, randomRange(100,500));
});
promises.push(p);
}
Promise.all(promises).then(values => {
console.log(values);
});
function randomRange(min, max) {
return min + Math.floor(Math.random() * (max - min + 1));
}
&#13;