Closed meteor199 closed 1 month 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;
}
主要改动: