此代码应清空数组,但由于数据量太大,因此无法将其清空,并且该函数已返回该值。
while循环在处理如此大的数组时花费的时间比函数返回值所花费的时间更长。
所以,我需要等待循环,返回预期值,应该怎么做?
function a(max) {
var arr = Array.apply(null, Array(max)).map((cur, index) => index),
l = arr.length,
acc = 0;
while(acc < l) {
arr.splice(acc, 1);
acc++;
}
return arr;
}
console.log(a(100000).length);
那么,我该如何等待执行呢? ,我想我应该做一些等待,承诺或回调,但我仍然是异步函数和执行的新手。
PD:我读过关于生成器,等待,异步,但我不知道应该使用什么以及如何应用它们。这不是代码问题,有100或1000个元素,代码工作正常,但是100000 while循环需要更多时间,所以main函数在完成while循环之前返回值。
我想返回arr,当且仅当数组完全清空时才会返回。
另一次尝试:
function a() {
var flag = false, acc = 0;
while(acc > 100000) {
flag = true;
}
return flag;
}
console.log(a())
想要返回值,当且仅当while循环结束时,所以函数应该返回true
答案 0 :(得分:1)
你正在思考这个问题。您的问题是如何实施splice
。当{while}循环迭代时,acc
变量变为什么。如果您的max
为100,您是否同意在某个时候,acc
将等于99
?然后,您的拼接将以arr.splice(99, 1)
运行。这是一个反向索引范围,没有正确的含义。当你尝试这样做时,JavaScript不会抛出错误,因为它是邪恶的。
你应该做的是反复拼接第一个元素,它在索引0处。它始终在索引0处,因为每次运行spice
时都会改变数组。这是您正在寻找的代码。为简洁起见,我做了一些修改。
function a(max) {
const arr = [...Array(max)].map((_, idx) => idx)
const arrLength = arr.length
let acc = 0
while (acc < arrLength) {
arr.splice(0, 1)
acc++
}
return arr
}
console.log(a(10000))
此代码是同步的。是的,JavaScript有一些特殊的概念需要像Promise
这样的东西,但这不是其中之一。现在你有了这段代码,max
10e6
会导致函数永远不会完成,因为操作太耗时了。如果您尝试,您的浏览器将锁定。即使10000也相对较慢。
编辑:
我保证这些是同步操作。你为什么这么坚持他们不是?对于您的新代码,它缺少多项内容。首先,acc > 100000
将立即返回false并跳过循环。其次,你永远不会增加你的acc
。这是修复后的代码。
function flagTest() {
var flag = false, acc = 0;
while(acc < 100000) {
flag = true;
acc++
}
return flag;
}
console.log(flagTest())