Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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/9/loops/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 do while循环即使在while为true时也不会继续_Javascript_Loops_Do While - Fatal编程技术网

Javascript do while循环即使在while为true时也不会继续

Javascript do while循环即使在while为true时也不会继续,javascript,loops,do-while,Javascript,Loops,Do While,好的,我使用jQuery进行了一个do-while循环。基本上,它的目的是检查目录中是否有照片,并将其添加到数组中。目录中的照片都被命名为“phone01.png”、“phone02.png”等,它们位于一个名为“slides”的目录中 代码如下: var images = []; var i=0; do { ++i; $.get('./slides/phone0' + i + '.png',function(){ images[

好的,我使用jQuery进行了一个do-while循环。基本上,它的目的是检查目录中是否有照片,并将其添加到数组中。目录中的照片都被命名为“phone01.png”、“phone02.png”等,它们位于一个名为“slides”的目录中

代码如下:

var images = [];
var i=0;

    do {
        ++i;
        $.get('./slides/phone0' + i + '.png',function(){
            images[(i-1)] = './slides/phone0' + i + '.png';
        });
    }
    while ( images[(i-1)] == './slides/phone0' + i + '.png' );
因此,如果在最后使用控制台,images[]只包含“./slides/phone01.png”,但是

我1岁

因此,图像[i-1]为“/slides/phone0”+i+”.png”

输入图像[i-1]=='./slides/phone0'+i+'.png'返回true。因此while语句为true,但循环没有继续

此外,如果我再次手动运行循环iterate I,则运行get,get将成功并向数组中添加一个新成员。因此,do函数不会再次运行


给出了什么?

$。get是一个异步请求。因此,您的循环将始终运行一次,因为映像数组从未按预期设置。

$。get是一个异步请求。因此,您的循环将始终运行一次,因为映像数组从未按预期设置。

这是一个典型的异步问题

当您调用$.get时,它不会立即进入您给它的函数中

发生的情况是,它设置了一个HTTP请求,并将该函数作为请求成功时要调用的函数附加到请求中

然后,程序的原始部分继续它自己的业务,并且忘记了HTTP请求及其传递给它的函数

在这种情况下,程序的原始部分是while循环。一旦它放弃了它的功能,它就会继续并围绕while循环循环

在每次循环迭代中创建的函数都不会被激发,直到a HTTP请求得到成功响应,b正在运行的其余Javascript代码停止阻塞线程并给它一个运行的机会

这称为异步代码,是术语“AJAX”的第一个“A”。这也是Javascript的整个事件处理模型的工作原理,以及您在jQuery中看到的所有嵌套函数。这也可以解释您可能看到的代码似乎以错误顺序运行的其他情况

如果您想用异步代码执行这样的循环,您需要以完全不同的方式编写它:编写的传统while循环将无法工作

有很多方法可以做到这一点,但我建议你不要只是给你一些代码,而是多挖掘一下整个过程是如何工作的,因为如果你要写Ajax代码,你需要理解这些东西

不过,我要给你一个提示:在这种程序中,全局变量通常不是那么有用。从代码示例中不清楚你的变量是否是全局变量,但是如果它们是,那么你肯定想考虑将它们变成局部变量并在函数之间传递它们,而不是仅仅期望将它们设置在一个地方,而使它们在另一个位置工作。
希望有帮助。

这是一个典型的异步问题

当您调用$.get时,它不会立即进入您给它的函数中

发生的情况是,它设置了一个HTTP请求,并将该函数作为请求成功时要调用的函数附加到请求中

然后,程序的原始部分继续它自己的业务,并且忘记了HTTP请求及其传递给它的函数

在这种情况下,程序的原始部分是while循环。一旦它放弃了它的功能,它就会继续并围绕while循环循环

在每次循环迭代中创建的函数都不会被激发,直到a HTTP请求得到成功响应,b正在运行的其余Javascript代码停止阻塞线程并给它一个运行的机会

这称为异步代码,是术语“AJAX”的第一个“A”。这也是Javascript的整个事件处理模型的工作原理,以及您在jQuery中看到的所有嵌套函数。这也可以解释您可能看到的代码似乎以错误顺序运行的其他情况

如果您想用异步代码执行这样的循环,您需要以完全不同的方式编写它:编写的传统while循环将无法工作

有很多方法可以做到这一点,但我建议你不要只是给你一些代码,而是多挖掘一下整个过程是如何工作的,因为如果你要写Ajax代码,你需要理解这些东西

不过,我要给你一个提示:在这种程序中,全局变量通常不是那么有用。从代码示例中不清楚你的变量是否是全局变量,但是如果它们是,那么你肯定想考虑将它们变成局部变量并在函数之间传递它们,而不是仅仅期望将它们设置在一个地方,而使它们在另一个位置工作。 希望能有所帮助。

我们 ll首先,我对立即调用的函数表达式的工作原理仍知之甚少,我尝试了以下方法:

var i=0;

do {
    ++i;
    (function(iteration){
        $.get('./slides/phone0' + i + '.png',function(){
            images[(i-1)] = './slides/phone0' + i + '.png';
        });
    })(i);
}
while ( images[(i-1)] == './slides/phone0' + i + '.png' );
要尝试在while循环中强制计算GET。。。无济于事。我已经决定了以下几点。欢迎您对该方法的有效性/清洁性提出任何意见。我可能从C的角度考虑了太多函数中的函数在此处插入Xzibit meme。但这确实完成了任务:

var i=0;

function createArray(){
    $.get('./slides/text0' + (i+1) + '.txt',function(data){
        texts.push(data);
    });
    $.get('./slides/phone0' + (i+1) + '.png',function(){
        images[i] = new Image();
        images[i].src = './slides/phone0' + (i+1) + '.png';
        i++;
        createArray();
    }).error(function(){
        slider();
    });
}

首先,我对立即调用的函数表达式的工作原理仍知之甚少,因此尝试了以下方法:

var i=0;

do {
    ++i;
    (function(iteration){
        $.get('./slides/phone0' + i + '.png',function(){
            images[(i-1)] = './slides/phone0' + i + '.png';
        });
    })(i);
}
while ( images[(i-1)] == './slides/phone0' + i + '.png' );
要尝试在while循环中强制计算GET。。。无济于事。我已经决定了以下几点。欢迎您对该方法的有效性/清洁性提出任何意见。我可能从C的角度考虑了太多函数中的函数在此处插入Xzibit meme。但这确实完成了任务:

var i=0;

function createArray(){
    $.get('./slides/text0' + (i+1) + '.txt',function(data){
        texts.push(data);
    });
    $.get('./slides/phone0' + (i+1) + '.png',function(){
        images[i] = new Image();
        images[i].src = './slides/phone0' + (i+1) + '.png';
        i++;
        createArray();
    }).error(function(){
        slider();
    });
}

对我来说,只有看起来像DDOS攻击的才会出现。get需要时间从服务器下载文件,不要等待它完成…这是一个常见问题-这里实际上有两个。1只有一个i变量2 get回调是异步的。看到了吗,你想做什么,你不使用加载的映像?对我来说,只有看起来像DDOS攻击的才会发生。get需要时间从服务器下载文件,不要等待完成…这是一个常见问题-这里实际上有2个。1只有一个i变量2 get回调是异步的。看,你想做什么,你不使用加载的图像?嘿,Spudley,我真的很喜欢你的解释,我很高兴你没有把它全部泄露出去。@我还在工作。。。我会让你们知道的,当我有了真正的进步。我的想法是使用Xzibit函数作为函数中的函数,然后使用另一个函数来播放图像。再次感谢你的帮助。嘿,斯普德利,我真的很喜欢你的解释,我很高兴你没有把一切都泄露出去。@我还在工作。。。我会让你们知道的,当我有了真正的进步。我的想法是使用Xzibit函数作为函数中的函数,然后使用另一个函数来播放图像。再次感谢你的帮助。