目前我正在编写一个纯Rust MQTT5库(我知道已经有现成的,但我更想学习Rust),我遇到了这个问题。
我使用最新的稳定版Rust和tokio 1.0.1。
当我发送一个数据包到服务器时,我通常期望从服务器获得响应(例如PingReq / PingAck,Ping / Pong)。
不考虑时间超时和数据包冲突的逻辑,我写了一个简化版本的JavaScript代码(因为我对它比较熟悉)。
这个逻辑在Rust和它的futures中怎么实现呢?或者更明确地说:我能否以某种方式重新创建awaitPackage + onIncomingPacket的resolve()回调函数行为?
class Client {
awaitedPacketTypes = {};
/**
* a ping consist of a send ping and a receive pong
*/
async ping(){
await this.sendPacket("Ping");
return await this.awaitPackage("Pong");
}
async sendPacket(packetType) { /*...*/ }
/**
* This expects a specific packet type to be received in the future
* @param {*} packetType
*/
awaitPackage(packetType) {
return new Promise((resolve, reject) => {
this.awaitedPacketTypes[packetType] = {
resolve,
reject
};
});
}
/**
* This gets called for every packet from the network side and calls the correct resolver if something waits for this packet type
* @param {*} packet
*/
onIncomingPacket(packet) {
if(this.awaitedPacketTypes[packet.type]) {
this.awaitedPacketTypes[packet.type].resolve(packet);
this.awaitedPacketTypes[packet.type] = undefined;
} else {
/*...*/
}
}
}
await_package
导致丢失。在 JS 中,我们通常可以依靠事件队列来处理这个问题。 - Bergi