等待 Skulpt Javascript 函数中的事件发生

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

我想将 Sk.inputfun() 更改为 Skulpt,让用户输入 <textarea> 并按 ENTER 键提交。我需要将一个函数传递给 Skulpt 以获取用户输入,但是,除了 prompt() 之外,我找不到任何方法可以做到这一点。

我能想到的唯一方法是使用 setTimeout() 延迟 return 直到事件触发回车键按钮并更改标志。

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) timeout 函数不能 return 一个值,并且 b) timeout 甚至不会延迟 return 函数,它只是 return 什么都没有。

我也尝试过使用 .done(),但无法正常工作。

我在网上找不到任何方法可以做到这一点,任何帮助将不胜感激!

您需要 return 来自 inputfun 的 Promise,然后在 return 被按下时解决它。 (如果您不熟悉 Promises,它们非常值得一看 - 它们让您使用同步逻辑编写异步代码)。

类似这样的事情(使用您的代码作为基础):

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 为 input 的输入元素正在接收标准输入。查看您的 OP,您在谈论文本区域(尽管 JQuery .val() 应该可以正常工作)。根据您所谓的文本区域 ("output"),您的意图似乎是让 stdin 和 stdout 都包含一个共享的文本区域。如果是这样,我不确定您将如何区分 stdin 生成的内容和用户(随后)输入的内容。因此上面的代码假设有一个单独的输入字段。

我有一个与您类似的用例,我为 stdin 和 stdout 提供一个集成控制台的错觉是在我的输出末尾有一个 contenteditable 的跨度 div。在 keycode == 13 上,在我解决承诺并发回用户输入的内容之前,我将文本从输入范围中取出并将其附加到输出 div.