如何在JavaScript

问题描述:

阻塞输入从概念上讲什么,我需要在JavaScript做的是以下几点:如何在JavaScript

// A) set up stuff 

// B) collect values from input 
do { 
    var key = readKey(); 
    // do stuff like loading arrays, objects, etc based on this sequential input 
} while (key != '.') // period signifies completion 

// C) continue to do other stuff that can only be done once the arrays and objects from before are completely loaded. 

我知道IO是在JavaScript无阻塞。所以我尝试过设置键盘监听器并在setTimeout结构中循环,但是我无法避免程序执行飞到C),并且由于所有作为B)一部分的先决条件处理未完成而出错。

这里是我的尝试:

// A) prepare stuff 
var digrams = type() // B 
// C) deal with digrams (errors out if digrams not complete) 

function type() { 
    var loopid; 

    var loop = function() { 
    // NOP 
    }; 

    document.onkeypress = function (e) { 
    e = e || window.event; 
    var char = String.fromCharCode(e.keyCode); 
    ... 
    if (char=='.') { 
    document.onkeypress = null; 
    clearInterval(loopid); 
    return digrams; // arr of obj composed thru key input 
    } 
    } // keylistener 

    // Start the type loop 
    loopid = setInterval(loop, 10); 
} 

我真的需要一个方法来“反对”的JavaScript在这里。任何示例代码将不胜感激。

+1

或者,你可以与DOM的事件驱动架构工作。有一个'keyUp'监听器来监听''。''。发生这种情况时,请在“C”中运行代码。 –

+1

你可能只是在想这个错误。不要阻塞输入,处理输入事件。你说你试过听众,但没有显示你试过的东西。 – Carcigenicate

+1

你的问题非常含糊......你提到了一些键盘监听器,并忘记了用户有其他方法将值输入到字段中(如:复制粘贴)。你问如何阻止输入元素...阻止它到底是什么?加载阵列? Loaded Objects?...请澄清。 –

您可以使用Promise,异步返回一个值.then()

// A) prepare stuff 
var digrams = type(); 
digrams 
.then(funcion handleSuccess(value) { 
    // do stuff with `value` : `arr` passed to `resolve()` 
} 
, function handleError(err) { 
    // handle error 
}); // B 
// C) deal with digrams (errors out if digrams not complete) 

function type() { 
    return new Promise(function(resolve, reject) { 
    var loopid; 

    var loop = function() { 
     // NOP 
    }; 

    document.onkeypress = function (e) { 
     e = e || window.event; 
     var char = String.fromCharCode(e.keyCode); 
     ... 
     if (char=='.') { 
     document.onkeypress = null; 
     clearInterval(loopid); 
     resolve(arr); 
     // return digrams; // arr of obj composed thru key input 
     } 
     // reject(new Error("error message")); 
    } // keylistener 

    // Start the type loop 
    loopid = setInterval(loop, 10); 
    }); 
} 
+0

好吧,即使我需要从类型同步回(),承诺的想法听起来很有希望。 –

你可以把“阻塞”的代码放到一个函数,然后一旦KEYUP匹配.

喜欢的东西运行功能:

function myContinue(){ 
    ...your blocked code 
} 

document.onkeypress = function (e) { 
... assuming your keypress code is working 
    if (char=='.') { 
     myContinue(); 
    } 
} 

如果你想在continue函数外部访问的变量,在功能之外声明它们:

var arrayToLoad; 

function myContinue(){ 
    console.log(arrayToLoad); 
} 

document.onkeypress = function(e) { 
    ... 
    arrayToLoad.push(char); 
    ... 
     myContinue(); 
    ... 
} 

或者,您可以将vars传递给函数ñ

function myContinue(diagrams){ 
... 
} 

document.onkeypress = function(e) { 
... 
    myContinue(diagrams); 
+0

肖恩:这看起来挺有意思的,但具有类型()函数的想法是打开keylisteners,工艺双字母组合,关闭keylisteners,并返回双字母组合。所有这些都被封装到type()函数的行为中。并且只有在该功能下,密钥记录者才能激活。 –

+0

明白...让我重新思考这个问题 –

+0

我正要但是提'Promises' @ guest271314打我吧:)...我会检查答出 –