Javascript for循环中的嵌套延迟

时间:2013-11-15 21:08:26

标签: javascript

我正在尝试编制一个任务,其中受访者必须能够区分不同的类别。一个具体的例子是向受访者展示几张照片,并要求他们通过点击空格键来识别所有符合特定描述的照片。

我有8个“块”,或者换句话说有8个不同类别的照片。 (比如,第1区=戴帽子的人,第2区=戴眼镜的人等)。在每个区块中,我向受访者展示了20张照片,并要求他们识别与该区块类别相匹配的所有照片。

困难的部分是,在这项任务中,我需要将照片延迟一定量。具体地,在每个块的开始之前(即,在显示每个块中的第一张照片之前),我想要显示空白照片2秒。然后块开始。然后在每张照片之间,我会有1秒的间隔,在那里我会显示空白的照片。而且我想要显示每张照片1秒钟。所以在一个区块内,这个程序将会:

1)照片1秒钟 2)1秒空白照片 3)第二张照片1秒钟 4)1秒空白照片

等。我会在每个街区拍摄20张照片。我在实现照片之间的间隔时遇到了一些困难,以及显示正确运行照片的间隔。我正在使用的代码如下:

var total = 0;
var i = 0; // block counter
var locBlank = '.blankPhoto.jpg';
var stimulusInterval = 1000;
var totalTime = stimulusInterval * 20;
var interStimulusInterval = 1500;
var j = -1; // counter within block
function outer(){
    if (i++ < 8){
        block = blocks[i];
        blockPhotos = ... // code to get block photos
        var loc;
        inner();
        j = -1;
    }
    total += totalTime;
    totalTime *= 2; // new
    setTimeout(outer, total);
}

function inner(){
    if(j++ < 20){
        loc = blockPhotos[j];
        show_image(loc); // change image, then push results later
            // code to record response here...
    }
    if(j < 20){
        setTimeout(inner, stimulusInterval);
    }
}

正如你所看到的那样,尝试使用递归函数来做到这一点,我通过浏览类似的SO问题得到了这个想法。此代码也没有实现我需要做的照片之间的间隔。此代码完成了我想要的第一个块,但在该块之后无法正常工作。我的意思是在第二个区块中,照片之间的时间大约减半,然后在第二个区块之后没有显示其他照片。我原本试图在嵌套的for循环中使用setTimeout采用类似的方法,但这也不起作用。

我正在寻找有关如何实施所有这些延迟的解决方案。

1 个答案:

答案 0 :(得分:1)

我不推荐这种情况的递归,它只是一个简单的迭代任务。这样的事情可以完成这项工作,使用你自己的想象力来完成DoAction方法的第一部分,以及你需要actions数组中的数据。

var actions =
[
    { "action": "Photo 1", "duration": "2000" },
    { "action": "Photo 2", "duration": "2000" },
    { "action": "Blank", "duration": "1000" },
    { "action": "Photo 3", "duration": "2000" },
    { "action": "Photo 4", "duration": "2000" },
];

var actionIndex = 0;

function DoAction(){
    $("#actionContainer").text(actions[actionIndex].action);
    var delay = actions[actionIndex].duration;
    actionIndex++;
    if (actionIndex < actions.length)
    {
        setTimeout(DoAction, delay);
    }
}

DoAction();

http://jsfiddle.net/r4yRV/