You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.7 KiB

/*
* The SyncTaskRunner is a task serializer to enable running tasks synchronously.
* It takes as input a function to run a task, executes it and waits for completion.
* The SyncTaskRunner defines a markCompleted function to call back into to indicate
* task completion.
*/
define([
'common/Class',
'/static/app/DA-ITSI-CP-windows-dashboards/js/common/contrib/underscore.js'
],
function(
Class,
_
) {
/*
* taskLabel - a label for the task to enqueue
* taskFn - the function to execute for the task
* the signature for the function is:
* function(taskRunner, <any array of arguments passed in as taskFnArgs>)
* taskFnArgs - array of arguments to the task. Note that this array will
* not contain the taskRunner but the rest of the arguments
* specific to the function
* timeout - optional timeout for the task in ms
* timeoutFn - a timeout handler with the signature
* function(<any array of arguments passed in as timeoutFnArgs>)
* timeoutFnArgs - array of arguments to the timeout handler
*/
var SyncTaskRunner = function(
taskLabel,
taskFn,
taskFnArgs,
timeout /* in ms */,
timeoutFn,
timeoutFnArgs
) {
this._taskCompleted = false;
if (_.isUndefined(taskFn) || _.isNull(taskFn) || !_.isFunction(taskFn)) {
throw('Invalid task passed to SyncTaskRunner');
} else {
this._taskFn = taskFn;
this._taskFnArgs = taskFnArgs;
// First argument to the function is the runner so it could invoke markCompleted
this._taskFnArgs.unshift(this);
this._taskLabel = taskLabel;
}
if (_.isUndefined(timeout) || _.isNull(timeout)) {
this._timeout = 600000; // 10 minutes in ms
} else {
if (_.isNumber(timeout)) {
this._timeout = timeout;
} else {
throw('Invalid timeout passed to SyncTaskRunner. Please specify a number in ms');
}
}
if (_.isUndefined(timeoutFn) || _.isNull(timeoutFn) || !_.isFunction(timeoutFn)) {
throw('Invalid timeout handler passed to SyncTaskRunner');
} else {
this._timeoutFn = timeoutFn;
this._timeoutFnArgs = timeoutFnArgs;
}
this._waitHandle = null;
}
var SyncTaskRunnerClass = Class.makeClass(SyncTaskRunner);
SyncTaskRunnerClass.start = function() {
var that = this;
if (this._taskCompleted) {
throw('The task ' + this._taskLabel + ' has already completed');
}
this._taskFn.apply(this, this._taskFnArgs);
this._waitHandle = setInterval(
function() {
if (that._taskCompleted) {
clearInterval(that._waitHandle);
}
},
200
);
this._timeoutHandle = setTimeout(
function() {
that.markCompleted();
that._timeoutFn.apply(that, that._timeoutFnArgs);
},
this._timeout
);
}
/*
* This function MUST be called by the task when done otherwise the task will timeout.
*/
SyncTaskRunnerClass.markCompleted = function() {
this._taskCompleted = true;
clearTimeout(this._timeoutHandle);
}
SyncTaskRunnerClass.hasCompleted = function() {
return this._taskCompleted;
}
return SyncTaskRunner;
});