mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
Fix bug around debounced event not being flushed in time (#2536)
* fix bug around debounced event not being flushed in time * add comment
This commit is contained in:
committed by
Karl Burtram
parent
82aa493dfd
commit
2639b2bd2c
@@ -5,6 +5,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import { Emitter, Event } from 'vs/base/common/event';
|
import { Emitter, Event } from 'vs/base/common/event';
|
||||||
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implementation of vs/base/common/event/echo that is clearable
|
* Implementation of vs/base/common/event/echo that is clearable
|
||||||
@@ -37,3 +38,52 @@ export function echo<T>(event: Event<T>, nextTick = false, buffer: T[] = []): {
|
|||||||
clear
|
clear
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of vs/base/common/event/debounceEvent that is clearable
|
||||||
|
*/
|
||||||
|
export function debounceEvent<T>(event: Event<T>, merger: (last: T, event: T) => T, delay?: number, leading?: boolean): { clear: () => void; event: Event<T> };
|
||||||
|
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay?: number, leading?: boolean): { clear: () => void; event: Event<O> };
|
||||||
|
export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I) => O, delay: number = 100, leading = false): { clear: () => void; event: Event<O> } {
|
||||||
|
|
||||||
|
let subscription: IDisposable;
|
||||||
|
let output: O = undefined;
|
||||||
|
let handle: any = undefined;
|
||||||
|
let numDebouncedCalls = 0;
|
||||||
|
|
||||||
|
const clear = () => output = undefined;
|
||||||
|
|
||||||
|
const emitter = new Emitter<O>({
|
||||||
|
onFirstListenerAdd() {
|
||||||
|
subscription = event(cur => {
|
||||||
|
numDebouncedCalls++;
|
||||||
|
output = merger(output, cur);
|
||||||
|
|
||||||
|
if (leading && !handle) {
|
||||||
|
emitter.fire(output);
|
||||||
|
}
|
||||||
|
|
||||||
|
clearTimeout(handle);
|
||||||
|
handle = setTimeout(() => {
|
||||||
|
let _output = output;
|
||||||
|
output = undefined;
|
||||||
|
handle = undefined;
|
||||||
|
if (!leading || numDebouncedCalls > 1) {
|
||||||
|
emitter.fire(_output);
|
||||||
|
}
|
||||||
|
|
||||||
|
numDebouncedCalls = 0;
|
||||||
|
}, delay);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
onLastListenerRemove() {
|
||||||
|
subscription.dispose();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
event: emitter.event,
|
||||||
|
clear
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import * as WorkbenchUtils from 'sql/workbench/common/sqlWorkbenchUtils';
|
|||||||
import { IQueryManagementService } from 'sql/parts/query/common/queryManagement';
|
import { IQueryManagementService } from 'sql/parts/query/common/queryManagement';
|
||||||
import * as Utils from 'sql/parts/connection/common/utils';
|
import * as Utils from 'sql/parts/connection/common/utils';
|
||||||
import { SaveFormat } from 'sql/parts/grid/common/interfaces';
|
import { SaveFormat } from 'sql/parts/grid/common/interfaces';
|
||||||
import { echo } from 'sql/base/common/event';
|
import { echo, debounceEvent } from 'sql/base/common/event';
|
||||||
|
|
||||||
import Severity from 'vs/base/common/severity';
|
import Severity from 'vs/base/common/severity';
|
||||||
import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
|
import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration';
|
||||||
@@ -22,9 +22,10 @@ import * as types from 'vs/base/common/types';
|
|||||||
import { EventEmitter } from 'sql/base/common/eventEmitter';
|
import { EventEmitter } from 'sql/base/common/eventEmitter';
|
||||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
import { INotificationService } from 'vs/platform/notification/common/notification';
|
import { INotificationService } from 'vs/platform/notification/common/notification';
|
||||||
import { Emitter, debounceEvent, Event } from 'vs/base/common/event';
|
import { Emitter, Event } from 'vs/base/common/event';
|
||||||
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
||||||
import { ResultSerializer } from 'sql/parts/query/common/resultSerializer';
|
import { ResultSerializer } from 'sql/parts/query/common/resultSerializer';
|
||||||
|
import { TPromise } from 'vs/base/common/winjs.base';
|
||||||
|
|
||||||
export interface IEditSessionReadyEvent {
|
export interface IEditSessionReadyEvent {
|
||||||
ownerUri: string;
|
ownerUri: string;
|
||||||
@@ -73,25 +74,27 @@ export default class QueryRunner {
|
|||||||
public get isQueryPlan(): boolean { return this._isQueryPlan; }
|
public get isQueryPlan(): boolean { return this._isQueryPlan; }
|
||||||
|
|
||||||
private _onMessage = new Emitter<sqlops.IResultMessage>();
|
private _onMessage = new Emitter<sqlops.IResultMessage>();
|
||||||
private _echoedMessages = echo(debounceEvent<sqlops.IResultMessage, sqlops.IResultMessage[]>(this._onMessage.event, (l, e) => {
|
private _debouncedMessage = debounceEvent<sqlops.IResultMessage, sqlops.IResultMessage[]>(this._onMessage.event, (l, e) => {
|
||||||
// on first run
|
// on first run
|
||||||
if (types.isUndefinedOrNull(l)) {
|
if (types.isUndefinedOrNull(l)) {
|
||||||
return [e];
|
return [e];
|
||||||
} else {
|
} else {
|
||||||
return l.concat(e);
|
return l.concat(e);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
|
private _echoedMessages = echo(this._debouncedMessage.event);
|
||||||
public readonly onMessage = this._echoedMessages.event;
|
public readonly onMessage = this._echoedMessages.event;
|
||||||
|
|
||||||
private _onResultSet = new Emitter<sqlops.ResultSetSummary>();
|
private _onResultSet = new Emitter<sqlops.ResultSetSummary>();
|
||||||
private _echoedResultSet = echo(debounceEvent<sqlops.ResultSetSummary, sqlops.ResultSetSummary[]>(this._onResultSet.event, (l, e) => {
|
private _debouncedResultSet = debounceEvent<sqlops.ResultSetSummary, sqlops.ResultSetSummary[]>(this._onResultSet.event, (l, e) => {
|
||||||
// on first run
|
// on first run
|
||||||
if (types.isUndefinedOrNull(l)) {
|
if (types.isUndefinedOrNull(l)) {
|
||||||
return [e];
|
return [e];
|
||||||
} else {
|
} else {
|
||||||
return l.concat(e);
|
return l.concat(e);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
|
private _echoedResultSet = echo(this._debouncedResultSet.event);
|
||||||
public readonly onResultSet = this._echoedResultSet.event;
|
public readonly onResultSet = this._echoedResultSet.event;
|
||||||
|
|
||||||
private _onQueryStart = new Emitter<void>();
|
private _onQueryStart = new Emitter<void>();
|
||||||
@@ -171,8 +174,13 @@ export default class QueryRunner {
|
|||||||
private doRunQuery(input: string, runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): Thenable<void>;
|
private doRunQuery(input: string, runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): Thenable<void>;
|
||||||
private doRunQuery(input: sqlops.ISelectionData, runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): Thenable<void>;
|
private doRunQuery(input: sqlops.ISelectionData, runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): Thenable<void>;
|
||||||
private doRunQuery(input, runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): Thenable<void> {
|
private doRunQuery(input, runCurrentStatement: boolean, runOptions?: sqlops.ExecutionPlanOptions): Thenable<void> {
|
||||||
|
if (this.isExecuting) {
|
||||||
|
return TPromise.as(undefined);
|
||||||
|
}
|
||||||
this._echoedMessages.clear();
|
this._echoedMessages.clear();
|
||||||
this._echoedResultSet.clear();
|
this._echoedResultSet.clear();
|
||||||
|
this._debouncedMessage.clear();
|
||||||
|
this._debouncedResultSet.clear();
|
||||||
let ownerUri = this.uri;
|
let ownerUri = this.uri;
|
||||||
this._batchSets = [];
|
this._batchSets = [];
|
||||||
this._hasCompleted = false;
|
this._hasCompleted = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user