1. 程式人生 > 其它 >cube.js 基於http 通道的資料實時更新bug 解決

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