跳到主要内容

事件与取消

Event​

Event<T> 是一个函数。调用它并传入监听器,就完成订阅,返回值是 Disposable。

const disposable = vscode.workspace.onDidChangeTextDocument(event => {
// event.document 是发生变化的文档
console.log(event.document.uri.toString());
});
context.subscriptions.push(disposable);

监听器抛错不应拖垮发射方。订阅要释放,否则扩展重载后旧监听还在。

EventEmitter​

扩展自己要通知别人时使用。event 暴露给外部订阅,fire 发出值。

const emitter = new vscode.EventEmitter<string>();
context.subscriptions.push(emitter);
// 外部只能订阅,不能 fire
const onDidChange = emitter.event;
emitter.fire('updated');

树的 onDidChangeTreeData、自定义诊断刷新,都是这个模式。

CancellationToken​

一次请求的取消标志。

成员作用
isCancellationRequested已经取消则为真
onCancellationRequested取消时回调,返回 Disposable

语言功能的 token 由 VS Code 创建。用户继续输入、关闭文档、或更近的一次请求到来时,旧 token 会被取消。

自己发起可取消工作时用 CancellationTokenSource:

const source = new vscode.CancellationTokenSource();
try {
await doWork(source.token);
} finally {
source.dispose();
}
source.cancel(); // 需要中止时调用

CancellationError 用来把「被取消」和普通失败区分开。被取消时通常不要弹错误提示。

Thenable​

API 里大量返回 Thenable<T>,也就是带 then 的对象,Promise 满足这个形状。注册函数可以同步返回结果,也可以返回 Promise。取消后不要再把过期结果写进界面。

参考​