Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环递增,但在结束时递增_Javascript_Variables_For Loop_Increment - Fatal编程技术网

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);
}