[英]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.