Rust 如何将JS承诺转化为生锈
目前,我正在编写一个纯粹的Rust MQTT5库(我知道存在一些库,但我更努力地学习Rust),我一直在解决这个问题 我正在使用最新的稳定锈菌与东京1.0.1 当我通过线路发送一个数据包时,我通常期望服务器做出响应(例如下面的PingReq/PingAck、Ping/Pong) 省略了很多关于超时和数据包冲突的if逻辑,我用JavaScript编写了一个简化版本的逻辑(因为我很清楚这一点) 这一逻辑将如何转化为生锈及其未来? 或者更清楚地说:我是否可以以某种方式重新创建waitpackage+onincomingpackage的resolve()回调函数行为Rust 如何将JS承诺转化为生锈,rust,rust-tokio,Rust,Rust Tokio,目前,我正在编写一个纯粹的Rust MQTT5库(我知道存在一些库,但我更努力地学习Rust),我一直在解决这个问题 我正在使用最新的稳定锈菌与东京1.0.1 当我通过线路发送一个数据包时,我通常期望服务器做出响应(例如下面的PingReq/PingAck、Ping/Pong) 省略了很多关于超时和数据包冲突的if逻辑,我用JavaScript编写了一个简化版本的逻辑(因为我很清楚这一点) 这一逻辑将如何转化为生锈及其未来? 或者更清楚地说:我是否可以以某种方式重新创建waitpackage+o
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 {
/*...*/
}
}
}
或者更清楚地说:我是否可以以某种方式重新创建waitpackage+onincomingpackage的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 {
/*...*/
}
}
}
有点?生锈的未来只不过是“可以为准备情况进行民意调查的东西”,它是一个比JS承诺低得多的概念
有一些库声称提供JS风格的承诺,但大多数异步库可能提供一个类似的对象,命名方式不同,例如在Tokio中,您可能需要一个,这是一个可以发送单个值的通道,结果是:
struct数据包{r#类型:&'static str}
结构客户端{
等待:Mutex注意,虽然这是OP的js代码的适当等价物,但最好对传入的数据包进行排队,这样,如果在收到数据包之前没有调用Wait_package
,它们就不会丢失。在js中,我们通常可以依赖事件队列来处理这些数据包。很高兴在这里提到它。我的逻辑已经有了这一点,但我删除了它以简化问题。