【问题标题】:Wait for an event to occur within a function in Javascript for Skulpt在 Javascript for Skulpt 的函数中等待事件发生
【发布时间】:2017-05-02 08:58:28
【问题描述】:

我想将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) timeout 函数不能返回值,b) Timeout 甚至没有延迟返回函数,它只是什么都不返回。

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

似乎没有任何方法可以在网上找到,任何帮助将不胜感激!

【问题讨论】:

    标签: javascript jquery html skulpt


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!我打算将原始 textarea val 与最终 val 进行比较以获取用户输入,但您的解决方案要好得多。
    猜你喜欢
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多