3

我想更改SkulptSk.inputfun()以让用户输入 a并按下键提交。我需要将一个函数传递给获取用户输入的 Skulpt,但是,除了.<textarea>ENTERprompt()

我能想到的唯一方法是延迟返回使用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) timeout 函数不能返回值,b) Timeout 甚至没有延迟返回函数,它只是什么都不返回。

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

我似乎无法在网上找到任何方法来做到这一点,任何帮助将不胜感激!

4

1 回答 1

1

你需要从你的 inputfun 中返回一个 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 为 input 的元素正在接收标准输入。查看您的 OP,您正在谈论一个 textarea (尽管 JQuery .val() 应该可以正常工作)。根据您所说的 textarea(“输出”),您的意图似乎是让 stdin 和 stdout 都涉及共享的 textarea。如果是这样,我不确定您将如何区分 stdin 生成的内容和用户(随后)输入的内容。因此,上面的代码假定一个单独的输入字段。

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

于 2017-06-08T11:32:50.960 回答