2017-05-02 27 views
3

我想更改Sk.inputfun()Skulpt讓用戶鍵入一個<textarea>並點擊ENTER鍵提交。我需要將單個函數傳遞給Skulpt以獲取用戶輸入,但是,除prompt()之外,我找不到任何其他方法來執行此操作。我的問題與以下類似,但是沒有答案。 Skulpt Assign Sk.inputfun() to type response into output when input() called 我認爲這樣做的唯一方法是使用setTimeout()延遲返回,直到事件觸發回車鍵按鈕並更改了標誌。等待一個事件發生在Javascript中的一個函數Skulpt

var enterPressed = false; 
$("#output").keyup(function(e){ 
    if((e.keyCode || e.which) == 13) { //Enter keycode 
     enterPressed = true; 
    } 
}); 

,然後等待我發生了變化:

Sk.configure({ 
    inputfun: function (prompt) { 
     function checkFlag() { 
      if(enterPressed) { 
      enterPressed = false 
      return $('#output').val(); 
      } else { 
      window.setTimeout(checkFlag, 100); 
      } 
     } 
     return checkFlag(); 
    }, 
    inputfunTakesPrompt: true, 
    output: outf, 
    read: builtinRead 
}); 

但是幾個原因,這這麼想的工作。 a)超時函數不能返回一個值,並且b)超時函數甚至不會延遲返回函數,並且它什麼也不返回。

我已經嘗試使用.done()以及但不能得到它的工作。

似乎沒有辦法做到這一點,我可以在網上找到任何幫助將不勝感激!

回答

1

您需要從您的inputfun中返回一個Promise,然後在按下返回時解析該Promise。 (如果您對Promises不熟悉,那麼他們非常值得一看 - <grossSimplification>他們讓您使用同步邏輯編寫異步代碼</grossSimplification >)。

像這樣(使用代碼作爲鹼):

Sk.configure({ 
    inputfun: function() { 
     // the function returns a promise to give a result back later... 
     return new Promise(function(resolve,reject){ 
     $("#input").on("keyup",function(e){ 
      if (e.keyCode == 13) 
      { 
       // remove keyup handler from #output 
       $("#input").off("keyup"); 
       // resolve the promise with the value of the input field 
       resolve($("#input").val()); 
      } 
     }) 
     }) 
    }, 
    output: outf, 
    read: builtinRead 
}); 

我假定輸入元件與輸入的ID接收標準輸入。看看你的OP,你在談論一個textarea(儘管JQuery .val()應該在這方面工作得很好)。根據你所謂的textarea(「輸出」),你的意圖是讓stdin和stdout都涉及一個共享的textarea。如果是這樣,我不知道你將如何區分stdin生成的內容和用戶輸入的內容。因此上面的代碼假定有一個單獨的輸入字段。

我對你有一個類似的用例,我對stdin和stdout的集成控制檯的幻想方式是在輸出div的末尾有一個滿足contenteditable的跨度。在鍵碼== 13上,在我解析好承諾併發回用戶輸入的內容之前,我將文本從輸入範圍中取出並附加到輸出格。

+0

非常感謝!我打算將原始的textarea val與最終的val進行比較以獲得用戶輸入,但是您的解決方案要好得多。 – DeltaMarine101

相關問題