2015-11-05 31 views
0

我想修改腳本從jsPsych圖書館的語言和心理學實驗,這裏是一個代碼,顯示圖像行和比用戶可以回答。setInterval,不同的時間間隔爲最後一個和最後一個元素之前(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? 

我不知道這是否足夠幫助我,但如果沒有,問我我會盡力做到最好。提前感謝!

回答

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,則顯示第二個圖像。等等。如果共十個圖像的將被顯示,則初始值被〖〗米_0 = 8,〖〗米_1 = 0,並且〖〗米_2 = 2.m_0用於控制使用時間的第一間隔的。 m_2用於控制第二個時間間隔的使用。 m_1用於顯示圖像。

有兩種執行或運行邏輯:

  1. 第一執行或運行邏輯(RN1)使用所述第一時間間隔(例如一秒鐘)。它顯示圖像1到n-1。顯示圖像n-1後,它將刪除間隔對象,併爲第二個執行邏輯安排一個新的間隔對象。

  2. 第二執行或運行邏輯(RN2)使用的時間(例如4秒)的第二時間間隔。它顯示最後一張圖像,然後從顯示中刪除最後一張圖像。

有三種顯示圖像的方法。第一種方法(T_0)與遞增1 M_1和由1遞減M_(0)第二種方法(T_1)與遞增1 M_1和由1遞減M_2結合了下一個圖像的顯示相結合的下一個圖像的顯示第三種方法(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日起​​。

1

相反的setInterval,你可以鏈setTimeout的回調。這將允許您操作每個函數調用之間的延遲。以下是我如何構建您的功能,然後執行邏輯來確定最後兩個測試的延遲。

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); 
+0

非常感謝,我理解你的解決方案,但問題是,我無法從函數中獲得剩餘多少測試/展示圖像或...(我花了整整一晚的時間)。整個腳本在[鏈接](http://pastebin.com/1AeQivBg) –

+0

我明白了。我更新了我的解決方案,現在showImage函數接受參數,以便遞歸地跟蹤它當前正在進行的測試。您需要包裝函數將參數傳遞給setTimeout回調函數。你怎麼看? –

+0

它看起來很酷,今天晚上我會試試,我會告訴你,非常感謝! –

相關問題