unit-mesh / auto-dev-vscode

AutoDev - 🧙‍the AI-powered coding wizard . Put the most loved AutoDev AI assistant into your VSCode, and have things done quickly
http://vscode.unitmesh.cc/
MIT License
234 stars 38 forks source link

refactor(chatView): Enhance chatView by avoiding webview destruction and boosting operation speed #70

Closed meteor199 closed 1 month ago

meteor199 commented 2 months ago

主要改动:

  1. chatView 保持常驻状态,不再自动销毁。
  2. 在通信中添加 request 方法,待 GUI 返回后,promise 再进行返回。
  3. Quick Chat、explainCode、optimizeCode 采用 request 替代 setTimeout,以提升操作速度。
zhengxs2018 commented 2 months ago

使用 死循环 和 promise 并不是很好的事情,可以考虑使用延迟等待技术。

export class ContinueViewProvider {
    // 延迟等待
    private _readyDefer = defer<void>();

    handleViewLoad() {
        // 解决延迟
        this._readyDefer.resolve();
    }

    // 公共方法
    ready() {
        return this._readyDefer.promise;
    }

    async request() {
        // 开始等待
        await this.ready();

        // 你的代码
    }
}

之前是 Promise 是打算内置 defer 的,但觉得简单就去掉了,这是我的参考:

interface Deferred<T> {
    abort: () => void;
    resolve: (value: T) => void;
    reject: (reason?: unknown) => void;
    promise: Promise<T>;
}

function defer<T>(signal?: AbortSignal): Deferred<T> {
    const ac = new AbortController();
    const dtd = {} as Deferred<T>;

    dtd.promise = new Promise((resolve, reject) => {
        dtd.resolve = resolve;
        dtd.reject = reject;
    });

    function onDidAbort() {
        dtd.reject(new Error('user aborted'));
    }

    ac.signal.addEventListener('abort', onDidAbort);

    if (signal) {
        signal.addEventListener('abort', onDidAbort);
    }

    dtd.abort = function () {
        ac.abort();
    };

    return dtd;
}