我正在尝试编制一个任务,其中受访者必须能够区分不同的类别。一个具体的例子是向受访者展示几张照片,并要求他们通过点击空格键来识别所有符合特定描述的照片。
我有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采用类似的方法,但这也不起作用。
我正在寻找有关如何实施所有这些延迟的解决方案。
答案 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();