通过本节的学习,您将了解到如何使用JavaScript代码来实现按键输入功能。JSDuino开发板上一共拥有3个用户自定义按键,其中wkup按键在启动前三秒内作为启动固件下载和程序下载功能使用。当程序启动之后,wkup按键可以自由支配。在js代码按键回调函数中,通过判断按键名称可以知道哪个按键被使用。三个按键的名称分别是key0, key1, wkup。 这里我想更多的介绍一下关于JSDuino是如何实现按键实现回调函数。首先明确两个概念:事件驱动和Javascript是基于单线程来设计的。很多情况下JSDuino的行为都是异步的,例如按键、网卡、串口接收数据等等。虽然看起来这些行为可以随时随地触发,其实它们是在一个无限循环的loop里面按照先来先到的原则顺序执行的。首先任何一个行为触发会向系统发送一个事件,这个无限循环的loop里面会一直检测一个叫做事件任务列队的地方。只要列队里面一有任务事件,则立刻执行这个任务直到结束。也就是说,如果这个任务是阻塞式的,那么后面不管有多少任务都会被搁置,直到当前这个任务被执行完毕。像按键的回调函数、setInterval的超时回调函数等等都是基于这个事件机制来设计的。也就是说,这些回调函数里面尽量不要运行占用时间特别长的程序,以免导致后面的程序被耽搁了。 接下来我们可以聊聊为什么JavaScript语言是单线程的。对于不了解线程概念的朋友,可以简单的理解单线程就是一个无限循环的超级loop,就如同上面事件机制一样,一次只能执行一个任务,其他的任务都得靠边等着。而我们常说的操作系统都是多线程的,一次可以运行N个任务,没有谁会等着谁。但是JavaScript为什么这么设计呢,其实最早JavaScript语言是为浏览器设计的语言,主要用于用户与界面的互动以及DOM的操作。对于了解GUI的朋友可能知道,为了避免GUI互动中同步的问题,GUI往往也都是单线程设计。毕竟咱不可能一次点击到两个以上的按钮。JavaScript也一样,为了保证用户界面操作的过程性,也被设计为单线程。但是JavaScript真的只能是单线程么,其实像nodejs这样把JavaScript运用到服务器后端的情况时,JavaScript语言又被设计成了多线程来满足服务器性能的要求。
Key模块封装了如下几个API可供使用: on(function) 注册一个按键回调函数 参数 | | | 注册一个按键按下的回调函数,回调函数传递一个带有按键名称的字符串参数。 |
[mw_shl_code=javascript,true]var key= require("key");
function key_callback(keyName){
print(keyName);
}
//注册按键的回调函数
key.on(key_callback);
function loop(){
while(true){
}
}
loop();
[/mw_shl_code]
实验结果 当按键被按下之后,对应的按键名称会在回调函数中被打印出
|