架构图中可以看出codelab-adapter中的消息是异步的,无论是websocket还是ZeroMQ pub/sub,都是异步的。

有开发者希望codelab-adapter能支持应答模式: client(Scratch3.0/Blockly)发出request message,server回应reply message. 应答模式的逻辑由下图展现:

应答模式在积木块上的表现

使用应答模式的积木块,表现为运行的积木块,往codelab-adapter发出request message之后进入阻塞状态,直到codelab-adapter返回reply message,得到结果之后,才继续往下运行。

应答模式的应用场景

应答模式有很多应用场景,web开发者对http很熟悉,http便是典型的应答模式,想想你能用http做的事,便知道哪些事情适合用应答模式来做。

接触过ROS的开发者, 对异步消息和应答模式的使用场景应该很熟悉。ROS的核心便是消息系统。

我们举个具体例子,它来自codelab-adapter开发者的真实应用场景。 他需要一个REPORTER类型的积木块,该积木块的功能是获取电位计的值。

当然对于这个需求,我们可能会建议采用这种模式:源源不断发送电位计的值到scratch3.0中,诸如我们在extension_microbit采用的策略。但对于一些传感器或固件(如Firmata),采用同步模式可能是更经济简易的做法。

基于异步消息实现

由于异步消息是codelab-adapter基础架构的一部分,所以我们准备采用异步消息来实现应答模式。

我们写个简单的例子,来展示如何使用应答模式,积木块发出消息后,codelab-adapter的req-rep插件将消息反转,休眠1秒,再返回反转后的消息,以下是相应的源代码.

scratch3_req_rep

Scratch3.0中的插件源码见: scratch3_req_rep

核心是利用promise。在消息层面,为每条消息添加messageID.

extension_req_rep

codelab-adapter插件源码见: extension_req_rep

参考