setInterval,最后一个元素的不同间隔(jsPsych)

时间:2015-11-05 22:32:53

标签: javascript jspsych

我试图从jsPsych库修改脚本以进行语言和心理学实验,这里有一个代码,用于显示行中的图像,而不是用户可以回答的。

您可以设置图像可见的时间,但仅限于组(=每个图像的同一时间),但我需要显示最后一个图像和最后图像不同时间之前的图像。有人帮助我如何实现这个目标吗?

  var animate_interval = setInterval(function() {
    display_element.html(""); // clear everything
    animate_frame++;

    //zobrazeny vsechny obrazky
    if (animate_frame == trial.stims.length) { 
      animate_frame = 0;
      reps++;
      // check if reps complete //
      if (trial.sequence_reps != -1 && reps >= trial.sequence_reps) {
        // done with animation
        showAnimation = false;
      }
    }

    // ... parts of plugin, showing answers and so on.

  }, 
  3000); // <---------------- how to change this value for the last and one before lastelement?

我不知道这是否有助于我,但如果没有,请问我会尽力做到最好。非常感谢提前!

2 个答案:

答案 0 :(得分:1)

您可以链接setTimeout回调而不是setInterval。这将允许您操纵每个函数调用之间的延迟。这是我如何构建你的函数,然后实现逻辑来确定最后两个测试的延迟。

var showImage = function(currTest, lastTest) {
    display_element.html(""); // clear everything
    animate_frame++;

    //zobrazeny vsechny obrazky
    if (animate_frame == trial.stims.length) { 
        animate_frame = 0;
        reps++;
        // check if reps complete //
        if (trial.sequence_reps != -1 && reps >= trial.sequence_reps) {
            // done with animation
            showAnimation = false;
        }
    }
    // ... parts of plugin, showing answers and so on.

    // create a wrapper function so we can pass params to showImage
    var wrapper = function() {
        showImage(currTest + 1, lastTest);
    }

    if (currTest === lastTest) {
        setTimeout(wrapper, your_other_desired_delay);
    } else if (currTest - 1 === lastTest) {
        setTimeout(wrapper, your_desired_delay);
    } else if (currTest < lastTest) {
        setTimeout(wrapper, standard_delay);
    }
}

showImage(0, trials.length);

答案 1 :(得分:1)

可以使用setInterval以不同的时间间隔显示图像。请考虑以下事项:

控制系统使用相同的时间间隔显示图像1,2,... n-2,并使用另一个时间间隔(“setInterval”,2015)显示图像n-1,n。图1是根据Petri网的控制系统的过程模型。 For the PDF version of this reply, it is an interactive Petri Net.

enter image description here 图1

P_1(m_1)的标记等同于变量animate_frame。如果m_1 = 0,则不显示图像。如果m_1 = 1,则显示第一张图像。如果m_1 = 2,则显示第二个图像。等等。如果总共显示十个图像,则初始值为〖m〗_0 = 8,〖m〗_1 = 0,〖m〗_2 = 2.m_0用于控制第一个时间间隔的使用。 m_2用于控制第二时间间隔的使用。 m_1用于显示图像。

有两个执行或运行逻辑:

  1. 第一个执行或运行逻辑(rn1)使用第一个时间间隔(例如一秒)。它显示图像1到n-1。在显示图像n-1之后,它删除了间隔对象,并为第二个执行逻辑安排了一个新的间隔对象。

  2. 第二个执行或运行逻辑(rn2)使用第二个时间间隔(例如4秒)。它显示最后一张图像,然后从显示中删除最后一张图像。

  3. 有三种显示图像的方法。第一种方法(T_0)将下一图像的显示与递增m_1乘以1并将m_(0)递减1.第二种方法(T_1)组合下一图像的显示,将m_1递增1并将m_2递减1 。第三种方法(T_2)显示一个空格,删除最后一张图像。在任何给定时刻,可以不出现计算逻辑T_0,T_1和T_2中的一个或仅出现一个。当没有任何计算逻辑发生时,执行逻辑结束;换句话说,清除了间隔对象(例如clearInterval())。

    使用图1中的Petri网作为指南,控制系统的计算机程序可以按如下方式组织:

    <强> RN1

    if (m_0≥1)  {
      // T_0
      m_0=m_0-1
      m_1=m_1+1
      // update image using plugin API
    } else if ((m_0==0)  && (m_2≥1))  {
      // T_1
      m_2=m_2-1
      m_1=m_1+1
      // update image using plugin API
      clearInterval(ai);
      ai=setInterval(rn2,4000);
    } else
      clearInterval(ai);
    

    <强> RN2

    if (m_2≥1)  {
      // T_1
      m_2=m_2-1
      m_1=m_1+1
      // update image using plugin API
    } else if (m_2==10)  {
      // T_2
      m_1=m_1-1
      // hide image using plugin API
    } else
      clearInterval(ai);
    

    启动控制系统:

    ai=startInterval(rn1,1000);
    

    然后rn1最终将调用st2,rn2最终将结束该进程。如果需要额外的计算(例如display_element.html(&#34;&#34;)),请将它们添加到rn1和rn2。

    <强> 参考

    “setInterval,最后一个元素的不同间隔(jsPsych)”(2015)。堆栈溢出。 2015年11月5日从setInterval, different intervals for last and one before last element (jsPsych)检索。