我首次使用settimeout和回调解决了练习问题。这就是情况:
您会收到以下的JavaScript对象'record映射'
type: { [recordName: string]: Client }
客户端是允许a(发送短信的接口,b(通过注册回调函数接收短信。
interface Client {
sendMessage: (message: string) => void;
//to send messages to the Client
onMessage: (callback: (message: string) => void) =>
void; // a callback for receiving messages from the
Client
}
公共方法"初始化"将初始化活跃客户的跟踪。
目的是确保"记录映射"中没有记录对不活动的客户保存。
//要注册每10秒向所有客户发送" ping"消息。注册回调功能以从客户端接收消息。
发送和接收消息是一种通信的异步形式 - 给客户3秒钟以回复您的消息。
对于每个没有回复"乒乓"消息的客户,请从" recordmap"中删除他的记录。
type RecordMap = { [recordName: string]: Client };
class RecordTracker {
constructor (private recordMap: RecordMap) {}
public initialize (): void {
...?
}
public getRecordMap (): RecordMap {
return { ...this.recordMap };
}
}
我觉得我需要每10秒钟使用SetInterval进行一条消息,然后SettieMout发送和接收消息,但不确定从那里去哪里。
我不确定该去哪里。我需要创建一些虚拟客户端以致电吗?这就是我到目前为止的:
```
interface Client {
sendMessage: (message: string) => void;
onMessage: (callback: (message: string) => void) => void;
}
type RecordMap = { [recordName: string]: Client };
class RecordTracker {
constructor (private recordMap: RecordMap) {}
public initialize (): void {
setInterval(() => {
const sendMessage = (message) => {
//????
}
}, 10000)
}
public getRecordMap (): RecordMap {
return { ...this.recordMap };
}
}```
我将首先设计一个接受客户端的函数,然后检查它是否仍处于活动状态。一旦您熨了了那部分,就应该直接将其连接到某种常规测试方案中。
由于发送消息是异步的,因此我们的功能是异步。而且,由于我们要强行解决它,我们将明确创建一个诺言,以便我们可以在超时后解决。
这是我想到的内容:
async function getIsClientActive( client, timeoutMs ) {
return new Promise(resolve => {
// set up the timeout
setTimeout(() => resolve(false), timeoutMs)
// set up handler to listen for pong
const pongReceiver = ( msg ) => {
if(msg === 'pong') resolve(true)
}
client.onMessage = pongReceiver
// send the ping
client.sendMessage('ping')
})
}
一个大警告:我的getIsClientActive
假定劫持每个客户的onMessage
处理程序是安全的。如果这不安全,则可以在PING操作期间暂时将当前处理程序存储在RAM中(更简单(,也可以为每个客户端设置EventEmitter,以启动"消息"事件以及PING操作可以暂时订阅(更强大的(
我要强调的一件事:如果此客户端验证操作对您的程序用于跟踪所有已知客户端的数据结构一无所知,这将使您的工作变得更加容易。