簡體   English   中英

等待Javascript for Skulpt中的函數內發生事件

[英]Wait for an event to occur within a function in Javascript for Skulpt

我想改變Sk.inputfun()用於Skulpt讓一個用戶類型<textarea>並打ENTER鍵提交。 我需要將單個函數傳遞給Skulpt以獲取用戶輸入,但是,除了prompt()之外,我找不到任何方法來執行此操作。

我能想到的唯一方法是使用setTimeout()延遲返回,直到事件觸發回車鍵按鈕並更改標志。

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() ,但無法使用它。

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

您需要從inputfun返回一個Promise,然后在按下return時解析它。 (如果您不熟悉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的輸入元素正在接收stdin。 看看你的OP,你在談論textarea(雖然JQuery .val()應該可以正常工作)。 根據你所謂的textarea(“輸出”),似乎你的意圖是stdin和stdout都涉及一個共享的textarea。 如果是這樣,我不確定你將如何區分stdin生成的內容和用戶輸入的內容(后續)。 因此,上面的代碼假設一個單獨的輸入字段。

我有一個類似的用例,我給stdin和stdout的集成控制台的幻覺的方式是在輸出div的末尾有一個contenteditable的跨度。 在keycode == 13之前,在我解決了承諾並發回用戶輸入的內容之前,我將文本從輸入范圍中取出並將其附加到輸出div。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM