cube.js 基于http 通道的数据实时更新bug 解决

这个问题的原因核心还是官方在处理网络异常的是否没有进行异常处理,造成基于循环的数据获取处理了问题

参考代码

因为cube.js 实现了不同的transport http 的包含了http 的,ws 的包含了ws 的
http 的处理

 
class HttpTransport {
  constructor({ authorization, apiUrl }) {
    this.authorization = authorization;
    this.apiUrl = apiUrl;
  }
 
  request(method, params) {
    const searchParams = new URLSearchParams(
      params && Object.keys(params)
        .map(k => ({ [k]: typeof params[k] === 'object' ? JSON.stringify(params[k]) : params[k] }))
        .reduce((a, b) => ({ ...a, ...b }), {})
    );
 
    const runRequest = () => fetch(
      `${this.apiUrl}${method}?${searchParams}`, {
        headers: { Authorization: this.authorization, 'Content-Type': 'application/json' }
      }
    );
 
    return {
      async subscribe(callback) {
        const result = await runRequest();
       // 处理是问题的所在,如果runRequest 异常了,会造成后续基于递归的请求不能使用
        return callback(result, () => this.subscribe(callback));
      }
    };
  }
}

解决方法

  • subscribe 部分对于异步请求支持try catch
  • runRequest 部分catch 异常处理

以下主要说明关于subscribe的

async subscribe(callback) {
        let result={
          error:"error"
        };
        try{
           result = await runRequest();
        } 
        finally{
          return callback(result, () => this.subscribe(callback));
        }
      };

说明

临时的使用方法是先编译修改,之后copy 编译的文件到cube.js 项目中,包含dist,以及src

参考资料

https://github.com/cube-js/cube.js/issues/3493

posted on 2021-10-02 22:01  荣锋亮  阅读(70)  评论(0编辑  收藏  举报

导航