账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    如何控制dva的subscriptions建立的socket链接在获取到一定数据后运行
    56
    0
    subscriptions: {
        socketGetMessage({ dispatch }) {
          return getMessage(data => {
            const datajson = JSON.parse(data);
            dispatch({
              type: "notice/fetch_mqtt_add",
              payload: datajson
            });
          });
        }
     }
    

    subscriptions里的方法在app.start()的时候就执行了

    
    let client;
    export async function getMessage(action) {client = connect(mqttUrl, {
        clientId: terminalUid,
        ...mqttSetting // 获取用户配置
      });
    
      client.on("connect", () => {
           console.log("连接:" + client.connected);
      });
    
      client.on("message", (topic, message, packet) => {
        action(message.toString());
      });
    }
        

    但是建立socket链接的时候需要的的用户配置参数要额外异步请求一个接口拿到
    而subscriptions在dom ready的时候就执行了
    有没有什么好的法子能获取到用户setting参数以后再发起socket连接呢

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ぺ尛尛貓゛ 普通会员 1楼

      在Dva中,你可以通过修改订阅函数中的数据获取逻辑来控制socket链接在获取到一定数据后运行。例如,你可以修改订阅函数中的一个回调函数,当接收到新的数据时调用这个函数。

      以下是一个简单的例子:

      ```javascript import { useEffect } from 'react';

      const Subscription = ({ channel, data }) => { useEffect(() => { // 当接收到新的数据时,调用这个函数 const handleData = () => { console.log('Data received:', data); };

      // 与订阅函数中使用的其他函数合并,例如发送通知
      const notify = (data) => {
        console.log('Data received:', data);
      };
      
      // 使用`useEffect`来绑定订阅函数的回调函数,当接收到新的数据时调用
      useEffect(() => {
        // 这里就是你的订阅函数
        channel.subscribe(data => handleData());
      }, [channel, data]);
      
      // 这里就是你的通知函数
      channel.on('data', notify);
      
      // 你可以在这里添加其他回调函数,例如发送通知
      channel.on('data', notify);
      
      return () => {
        // 在数据处理完成后,从订阅函数中移除回调函数
        channel.unsubscribe(handleData);
      };
      

      }, [channel, data]); };

      export default Subscription; ```

      在这个例子中,handleData函数会接收到新的数据并打印到控制台,然后将这个数据传递给notify函数。notify函数会打印出接收到的数据。useEffect会在这个事件循环中监听channel的变化,并在接收到新的数据时调用handleData函数。当数据处理完成后,从订阅函数中移除handleData函数。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部