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

setInterval, different intervals for last and one before last element (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?

我不知道这是否足以帮助我,但如果不够,请问我,我会尽力做到最好。非常感谢!

您可以链接 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);

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

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

图一

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)使用第二个时间间隔(例如四秒)。它显示最后一张图像,然后从显示中删除最后一张图像。

图像的显示方式有以下三种。第一种方法(T_0)将下一张图像的显示与将 m_1 递增 1 并将 m_(0 ) 递减 1 结合起来。第二种方法(T_1)将下一张图像的显示结合起来m_1 递增 1 和 m_2 递减 1 的下一张图像。第三种方法 (T_2) 显示空白 space,删除最后一张图像。在任何给定时刻,none 或计算逻辑 T_0、T_1 和 T_2 中的一个都可能发生。当none个计算逻辑可以发生时,执行逻辑结束;换句话说,间隔对象被清除(例如 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("")),将它们添加到 rn1 和 rn2。

参考资料

“setInterval,最后一个元素和最后一个元素之前的不同间隔(jsPsych)”(2015 年)。堆栈溢出。 2015 年 11 月 5 日从 检索。