Javascript 循环递增,但在结束时递增
我试图使用一个递增循环,但我希望它在循环结束时递增。遗憾的是,每当我简单地将Javascript 循环递增,但在结束时递增,javascript,variables,for-loop,increment,Javascript,Variables,For Loop,Increment,我试图使用一个递增循环,但我希望它在循环结束时递增。遗憾的是,每当我简单地将I++放在循环的末尾时,它的行为就不像我期望的那样。有人介意告诉我正确的方法吗 引用的增量循环: for (i = 1; i < 15; i++) { // do somthing here } (i=1;i
I++
放在循环的末尾时,它的行为就不像我期望的那样。有人介意告诉我正确的方法吗
引用的增量循环:
for (i = 1; i < 15; i++) {
// do somthing here
}
(i=1;i<15;i++)的{
//在这里做点什么
}
以下是我正在使用的循环:
for (i = 1; i < 15; i++) {
for (x = 1; x < 15; x++) {
var take = document.getElementById("row" + i + "sm" + x);
Tesseract.recognize(take)
.then(function(result) {
console.log(result.text);
// rows[i][x] = result.text;
})
}
}
(i=1;i<15;i++)的{
对于(x=1;x<15;x++){
var take=document.getElementById(“行”+i+“sm”+x);
特塞拉特。认出(拿)
.然后(函数(结果){
console.log(result.text);
//行[i][x]=result.text;
})
}
}
我希望它能做什么:
for (i = 1; i < 15) {
for (x = 1; x < 15) {
var take = document.getElementById("row" + i + "sm" + x);
Tesseract.recognize(take)
.then(function(result) {
console.log(result.text);
//rows[i][x] = result.text;
x += 1;
})
i += 1;
}
}
(i=1;i<15)的{
对于(x=1;x<15){
var take=document.getElementById(“行”+i+“sm”+x);
特塞拉特。认出(拿)
.然后(函数(结果){
console.log(result.text);
//行[i][x]=result.text;
x+=1;
})
i+=1;
}
}
我正在使用for
循环,因为我需要逐个迭代某些内容。如何在循环结束时正确增加I
下面是一段视频,解释了我在上下文方面的问题,并解释了为什么它不是一个异步问题。对不起,如果很难理解,我会很快用音频更新,这样我可以适当地解释
也许您应该尝试使用while循环。 像这样:
while i < 15:
//do something
i += 1
当i<15时:
//做点什么
i+=1
对于两个变量:x,i和嵌入:
while x < 15:
//do something
while i < 15:
//do something2
i += 1
x += 1
当x<15时:
//做点什么
而我<15:
//做点什么
i+=1
x+=1
希望我能正确理解这个问题。问题是第二个问题没有等到第一个问题完成 您可以尝试在内部使用递归。i,x可能有些错误,但你明白了 首先以i=1和x=1执行,在操作完成后(然后)调用下一个,直到所有元素都执行为止
function execItem(i, x) {
var take = document.getElementById("row" + i + "sm" + x);
Tesseract.recognize(take)
.then(function(result){
rows[i][x] = result.text;
if (i < 15 && x < 15) {
if (i > 15) {
x += 1
i = 1
} else {
i += 1
}
execItem(i, x)
}
})
}
execItem(1, 1)
函数执行项(i,x){
var take=document.getElementById(“行”+i+“sm”+x);
特塞拉特。认出(拿)
.然后(函数(结果){
行[i][x]=result.text;
如果(i<15&&x<15){
如果(i>15){
x+=1
i=1
}否则{
i+=1
}
执行项(i,x)
}
})
}
执行项目(1,1)
正如注释所示,这实际上可能是循环内的异步调用(Tesseract…然后
)的问题。当调用then
中的函数时,您的x
和i
值已经移动,因此无法得到预期的结果
一种解决方法是使用“闭包”——生成一个函数,该函数基于i
和x
的值创建另一个函数
function getDisplayFunc(row, col) {
function displayRecognisedText(result) {
console.log(row, col, result.text);
//rows[row][col] = result.text;
}
return displayRecognisedText;
}
for (i = 1; i < 15; i++) {
for (x = 1; x < 15; x++) {
var take = document.getElementById("row" + i + "sm" + x);
Tesseract.recognize(take).then(getDisplayFunc(i, x));
}
}
函数getDisplayFunc(行、列){
函数显示识别文本(结果){
日志(行、列、结果、文本);
//行[行][col]=result.text;
}
返回显示识别文本;
}
对于(i=1;i<15;i++){
对于(x=1;x<15;x++){
var take=document.getElementById(“行”+i+“sm”+x);
然后(getDisplayFunc(i,x));
}
}
我猜@Mike发现了错误:您的代码是异步的。这是什么意思 那么,假设你有一个循环:
for (i = 0; i < 10; i++) {
console.log(i);
}
但是,您不会直接在循环中打印您的值,而是作为承诺的后续操作。这使得这段代码是异步的。这意味着它不必在您调用它的确切时刻执行。我这里没有Tesseract,因此我将使用另一个非常古老的技巧,即setTimeout()
,使循环异步:
发生的情况是,当我通过回调(function(){console.log(I);}
异步函数“调度”将我们想要执行的操作(在本例中,打印I
值)传递给异步函数(recognize().then()
在您的情况下,在我的情况下,setTimeout()
)要尽快执行的操作,但这个“尽快”并不比循环快。因此,循环执行完毕,但我们的回调没有被调用,甚至一次也没有!由于您没有使用let
声明i
,因此它是一个全局变量,因此只存在一个i
。自从循环完成后,i
变量的值已经是10
这曾经是一件很难解决的事情,但是对于ES6来说,它非常简单:用let
声明i
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
for(设i=0;i<10;i++){
setTimeout(函数(){
控制台日志(i);
}, 0);
}
let
-ed变量,因此实际上有10个变量称为i
。函数的关闭将只能访问具有正确值的函数 请您详细说明,因为很难理解您对循环的期望。这似乎是一个错误。我认为您的问题是由于您在循环中运行异步进程造成的;你的正常循环也会一个接一个地迭代。你的代码中发生了什么事情没有按你想要的方式工作,以至于你想改变循环的工作方式?我和Mike在一起,异步在循环有点不同。。。Ok的可能副本,在这种情况下,您需要两个变量,一个用于i,一个用于x。你必须把一个嵌入另一个。像这样的。等等,我会改进我的答案。@LiamWeitzel for的每个循环都可以重写为,而循环可以重写为,反之亦然。let
声明迭代变量将以更简单的方式解决问题。它们将一个接一个地运行,但不会等待pr
for (i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
10
10
10
10
10
10
10
10
10
10
for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}