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

时间:2017-05-02 08:58:28

标签: javascript jquery html skulpt

我想更改SkulptSk.inputfun(),让用户输入<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(),但无法使用它。

似乎没有任何办法可以在网上找到,任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:1)

您需要从inputfun返回一个Promise,然后在按下return时解析它。 (如果你不熟悉Promises,那么它们非常值得一看 - &lt; grossSimplification&gt;它们允许你使用同步逻辑&lt; / grossSimplification&gt;编写异步代码。)。

像这样(使用你的代码作为基础):

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。