Rust 如何将JS承诺转化为生锈

Rust 如何将JS承诺转化为生锈,rust,rust-tokio,Rust,Rust Tokio,目前,我正在编写一个纯粹的Rust MQTT5库(我知道存在一些库,但我更努力地学习Rust),我一直在解决这个问题 我正在使用最新的稳定锈菌与东京1.0.1 当我通过线路发送一个数据包时,我通常期望服务器做出响应(例如下面的PingReq/PingAck、Ping/Pong) 省略了很多关于超时和数据包冲突的if逻辑,我用JavaScript编写了一个简化版本的逻辑(因为我很清楚这一点) 这一逻辑将如何转化为生锈及其未来? 或者更清楚地说:我是否可以以某种方式重新创建waitpackage+o

目前,我正在编写一个纯粹的Rust MQTT5库(我知道存在一些库,但我更努力地学习Rust),我一直在解决这个问题

我正在使用最新的稳定锈菌与东京1.0.1

当我通过线路发送一个数据包时,我通常期望服务器做出响应(例如下面的PingReq/PingAck、Ping/Pong)

省略了很多关于超时和数据包冲突的if逻辑,我用JavaScript编写了一个简化版本的逻辑(因为我很清楚这一点)

这一逻辑将如何转化为生锈及其未来? 或者更清楚地说:我是否可以以某种方式重新创建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 {
      /*...*/
    }
  }
}
或者更清楚地说:我是否可以以某种方式重新创建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中,我们通常可以依赖事件队列来处理这些数据包。很高兴在这里提到它。我的逻辑已经有了这一点,但我删除了它以简化问题。