【问题标题】:setInterval, different intervals for last and one before last element (jsPsych)setInterval,最后一个元素和最后一个元素之前的不同间隔(jsPsych)
【发布时间】:2015-11-05 22:32:53
【问题描述】:

我正在尝试修改来自 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?

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

【问题讨论】:

    标签: javascript jspsych


    【解决方案1】:

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

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

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

    共有三种显示图像的方式。第一种方法 (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("")),请将它们添加到 rn1 和 rn2。

    参考文献

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 非常感谢,我理解您的解决方案,但问题是,我无法从函数中获得剩余多少测试/显示图像或......(我已经花了整个晚上)。整个脚本在link
      • 我明白了。我更新了我的解决方案,现在 showImage 函数接受参数,因此您可以递归地跟踪它当前正在进行的测试。您需要包装函数将参数传递给 setTimeout 回调。你怎么看?
      • 看起来很酷,我今晚试试,我会告诉你的,非常感谢!
      猜你喜欢
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 2013-07-12
      • 2012-04-08
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多