now running correctly in buffered mode

This commit is contained in:
Philipp Kunz 2016-08-01 16:10:00 +02:00
parent 7a60f30f0b
commit d30fb551f9
8 changed files with 381 additions and 192 deletions

View File

@ -7,4 +7,24 @@ export declare let isTaskTouched: (taskArg: Task, touchedTasksArray: Task[]) =>
export declare let runTask: (taskArg: Task, optionsArg?: { export declare let runTask: (taskArg: Task, optionsArg?: {
touchedTasksArray: Task[]; touchedTasksArray: Task[];
}) => plugins.Q.Promise<{}>; }) => plugins.Q.Promise<{}>;
export declare let runBufferedTask: (taskArg: Task) => void; export interface cycleObject {
cycleCounter: number;
deferred: plugins.Q.Deferred<any>;
}
export declare class CycleCounter {
task: Task;
cycleObjectArray: cycleObject[];
constructor(taskArg: Task);
getPromiseForCycle(cycleCountArg: number): plugins.Q.Promise<{}>;
informOfCycle(): void;
}
export declare class BufferRunner {
task: Task;
bufferCounter: number;
bufferMax: number;
running: boolean;
constructor(taskArg: Task);
private _run();
setBufferMax(bufferMaxArg: number): void;
trigger(): PromiseLike<any>;
}

File diff suppressed because one or more lines are too long

View File

@ -1,21 +1,20 @@
/// <reference types="q" /> /// <reference types="q" />
import * as plugins from "./taskbuffer.plugins"; import * as plugins from "./taskbuffer.plugins";
import * as helpers from "./taskbuffer.classes.helpers";
export interface ITaskFunction { export interface ITaskFunction {
(): PromiseLike<any>; (): PromiseLike<any>;
} }
export declare class Task { export declare class Task {
name: string; name: string;
task: any; task: any;
running: boolean;
runningBuffered: boolean;
idle: boolean;
buffered: boolean; buffered: boolean;
bufferCounter: number;
bufferMax: number;
private _counterTriggerAbsolute;
private _state;
preTask: Task; preTask: Task;
afterTask: Task; afterTask: Task;
running: boolean;
bufferRunner: helpers.BufferRunner;
cycleCounter: helpers.CycleCounter;
idle: boolean;
private _state;
constructor(optionsArg: { constructor(optionsArg: {
taskFunction: ITaskFunction; taskFunction: ITaskFunction;
preTask?: Task; preTask?: Task;
@ -31,10 +30,10 @@ export declare class Task {
/** /**
* trigger task unbuffered. * trigger task unbuffered.
*/ */
triggerUnBuffered(): plugins.Q.Promise<{}>; triggerUnBuffered(): PromiseLike<any>;
/** /**
* trigger task buffered. * trigger task buffered.
*/ */
triggerBuffered(): plugins.Q.Promise<{}>; triggerBuffered(): PromiseLike<any>;
state: string; state: string;
} }

View File

@ -3,20 +3,19 @@ const plugins = require("./taskbuffer.plugins");
const helpers = require("./taskbuffer.classes.helpers"); const helpers = require("./taskbuffer.classes.helpers");
class Task { class Task {
constructor(optionsArg) { constructor(optionsArg) {
// initialize by default
this.running = false; this.running = false;
this.runningBuffered = false; this.bufferRunner = new helpers.BufferRunner(this);
this.cycleCounter = new helpers.CycleCounter(this);
this.idle = true; this.idle = true;
this.buffered = false; this._state = "ready";
this.bufferMax = 1;
this._counterTriggerAbsolute = 0;
var options = optionsArg; var options = optionsArg;
this.task = optionsArg.taskFunction; this.task = optionsArg.taskFunction;
this.preTask = options.preTask; this.preTask = options.preTask;
this.afterTask = options.afterTask; this.afterTask = options.afterTask;
this.running = false; this.idle = !this.running;
this.idle = !this.running && !this.runningBuffered;
this.buffered = options.buffered; this.buffered = options.buffered;
this.bufferMax = options.bufferMax; this.bufferRunner.setBufferMax(options.bufferMax);
this.name = options.name; this.name = options.name;
} }
/** /**
@ -46,16 +45,7 @@ class Task {
* trigger task buffered. * trigger task buffered.
*/ */
triggerBuffered() { triggerBuffered() {
var done = plugins.Q.defer(); return this.bufferRunner.trigger();
if (!(this.bufferCounter >= this.bufferMax)) {
this.bufferCounter++;
}
;
if (!this.runningBuffered) {
helpers.runBufferedTask(this);
}
;
return done.promise;
} }
get state() { get state() {
return this._state; return this._state;
@ -70,4 +60,4 @@ class Task {
} }
} }
exports.Task = Task; exports.Task = Task;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90YXNrYnVmZmVyLmNsYXNzZXMudGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBWSxPQUFPLFdBQU0sc0JBQ3pCLENBQUMsQ0FEOEM7QUFDL0MsTUFBWSxPQUFPLFdBQU0sOEJBR3pCLENBQUMsQ0FIc0Q7QUFPdkQ7SUFjSSxZQUFZLFVBT1g7UUFsQkQsWUFBTyxHQUFXLEtBQUssQ0FBQztRQUN4QixvQkFBZSxHQUFXLEtBQUssQ0FBQztRQUNoQyxTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ3BCLGFBQVEsR0FBVyxLQUFLLENBQUM7UUFFekIsY0FBUyxHQUFVLENBQUMsQ0FBQztRQUNiLDRCQUF1QixHQUFVLENBQUMsQ0FBQztRQWF2QyxJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ25ELElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDSCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLEVBQUUsQ0FBQSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRTtpQkFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLEVBQUU7aUJBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUFBLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNYLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUEsQ0FBQztZQUN4QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDeEIsQ0FBQztRQUFBLENBQUM7UUFDRixFQUFFLENBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQSxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFBLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ0wsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFFBQWU7UUFDckIsRUFBRSxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxDQUFBLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDM0IsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ0osT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztRQUNqRixDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUM7QUFoRlksWUFBSSxPQWdGaEIsQ0FBQSJ9 //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza2J1ZmZlci5jbGFzc2VzLnRhc2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy90YXNrYnVmZmVyLmNsYXNzZXMudGFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBWSxPQUFPLFdBQU0sc0JBQ3pCLENBQUMsQ0FEOEM7QUFDL0MsTUFBWSxPQUFPLFdBQU0sOEJBR3pCLENBQUMsQ0FIc0Q7QUFPdkQ7SUFjSSxZQUFZLFVBT1g7UUFkRCx3QkFBd0I7UUFDeEIsWUFBTyxHQUFXLEtBQUssQ0FBQztRQUN4QixpQkFBWSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxpQkFBWSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxTQUFJLEdBQVcsSUFBSSxDQUFDO1FBQ1osV0FBTSxHQUFVLE9BQU8sQ0FBQztRQVU1QixJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTztRQUNILElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsRUFBRSxDQUFBLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLENBQUMsZUFBZSxFQUFFO2lCQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQztZQUNGLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtpQkFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQUEsQ0FBQztRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7O0lBRUQ7O09BRUc7SUFDSCxpQkFBaUI7UUFDYixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksS0FBSztRQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFlO1FBQ3JCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FBQSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQzNCLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDLENBQUM7UUFDakYsQ0FBQztJQUNMLENBQUM7QUFDTCxDQUFDO0FBeEVZLFlBQUksT0F3RWhCLENBQUEifQ==

File diff suppressed because one or more lines are too long

View File

@ -4,123 +4,153 @@ let should = require("should");
import q = require("q") import q = require("q")
// setup some testData to work with // setup some testData to work with
let testTask:taskbuffer.Task; let testTask: taskbuffer.Task;
let testTaskFunction = function(){ let testTaskFunction = function () {
let done = q.defer(); let done = q.defer();
console.log("main function executed!") console.log("main function executed!")
done.resolve(); done.resolve();
return done.promise; return done.promise;
} };
let testTaskFunctionTimeout = function () {
let done = q.defer();
console.log("main function started!");
setTimeout(() => {
console.log("main function ended!");
done.resolve();
},2000);
return done.promise;
};
let testPreTask = new taskbuffer.Task({ let testPreTask = new taskbuffer.Task({
taskFunction:function(){ taskFunction: function () {
let done = q.defer(); let done = q.defer();
console.log("preTask executed"); console.log("preTask executed");
done.resolve(); done.resolve();
return done.promise; return done.promise;
}, },
preTask:testTask preTask: testTask
}); });
describe("taskbuffer",function(){
describe(".Task",function(){ // some more tasks to wirj with
it("new Task() should return a new task",function(){ let task1 = new taskbuffer.Task({
testTask = new taskbuffer.Task({taskFunction:testTaskFunction,preTask:testPreTask}); name: "Task 1",
taskFunction: () => {
let done = q.defer();
console.log("Task1 started");
setTimeout(() => {
console.log("Task1 executed");
done.resolve();
}, 5000)
return done.promise;
}
});
let task2 = new taskbuffer.Task({
name: "Task 1",
taskFunction: () => {
let done = q.defer();
console.log("Task2 started");
setTimeout(() => {
console.log("Task2 executed");
done.resolve();
}, 5000)
return done.promise;
}
});
let task3 = new taskbuffer.Task({
name: "Task 3",
taskFunction: () => {
let done = q.defer();
console.log("Task3 started");
setTimeout(() => {
console.log("Task3 executed");
done.resolve();
}, 5000)
return done.promise;
}
});
// the actual tests
describe("taskbuffer", function () {
describe(".Task", function () {
it("new Task() should return a new task", function () {
testTask = new taskbuffer.Task({ taskFunction: testTaskFunction, preTask: testPreTask });
}); });
it("testTask should be and instance of Task",function(){ it("testTask should be and instance of Task", function () {
testTask.should.be.instanceof(taskbuffer.Task); testTask.should.be.instanceof(taskbuffer.Task);
}); });
it("testTask.idle is true",function(){ it("testTask.idle is true", function () {
if (!testTask.idle){ if (!testTask.idle) {
throw new Error("testTask.idle is not true"); throw new Error("testTask.idle is not true");
} }
}); });
it("testTask.running is type boolean and initially false",function(){ it("testTask.running is type boolean and initially false", function () {
testTask.running.should.be.type("boolean"); testTask.running.should.be.type("boolean");
testTask.running.should.be.false(); testTask.running.should.be.false();
}); });
it("testTask.trigger() should return Promise",function(){ it("testTask.trigger() should return Promise", function () {
testTask.trigger().should.be.Promise(); testTask.trigger().should.be.Promise();
}); });
it("testTask.trigger() returned Promise should be fullfilled",function(done){ it("testTask.trigger() returned Promise should be fullfilled", function (done) {
testTask.trigger() testTask.trigger()
.then(done); .then(done);
}); });
it("should run a task without pre and afterTask",function(done){ it("should run a task without pre and afterTask", function (done) {
let localTestTask = new taskbuffer.Task({taskFunction:testTaskFunction}); let localTestTask = new taskbuffer.Task({ taskFunction: testTaskFunction });
localTestTask.trigger().then(done); localTestTask.trigger().then(done);
}); });
it("should run buffered", function (done) {
this.timeout(10000);
let localTestTask = new taskbuffer.Task({
taskFunction: testTaskFunctionTimeout,
buffered:true,
bufferMax:2
});
localTestTask.trigger();
localTestTask.trigger();
localTestTask.trigger();
localTestTask.trigger().then(() => {
done();
})
});
}); });
describe("Taskchain",function(){ describe("Taskchain", function () {
let testTaskchain; let testTaskchain;
let testTaskArray = [ let testTaskArray = [
new taskbuffer.Task({ new taskbuffer.Task({
name:"task1", name: "task1",
taskFunction:function(){ taskFunction: function () {
let done = q.defer(); let done = q.defer();
setTimeout(done.resolve,2000); setTimeout(done.resolve, 2000);
return done.promise; return done.promise;
} }
}), }),
new taskbuffer.Task({ new taskbuffer.Task({
name:"task2", name: "task2",
taskFunction: function(){ taskFunction: function () {
let done = q.defer(); let done = q.defer();
setTimeout(done.resolve,2000); setTimeout(done.resolve, 2000);
return done.promise; return done.promise;
} }
}), }),
]; ];
it("should run tasks in sequence",function(done){ it("should run tasks in sequence", function (done) {
this.timeout(5000); this.timeout(5000);
testTaskchain = new taskbuffer.Taskchain({ testTaskchain = new taskbuffer.Taskchain({
name:"Taskchain1", name: "Taskchain1",
taskArray:testTaskArray taskArray: testTaskArray
}); });
testTaskchain.trigger().then(done); testTaskchain.trigger().then(done);
}); });
}); });
describe("taskparallel",function(){ describe("taskparallel", function () {
let task1 = new taskbuffer.Task({ it("should run in Parallel", function (done) {
name:"Task 1",
taskFunction: () => {
let done = q.defer();
console.log("Task1 started");
setTimeout(() => {
console.log("Task1 executed");
done.resolve();
},5000)
return done.promise;
}
});
let task2 = new taskbuffer.Task({
name:"Task 1",
taskFunction: () => {
let done = q.defer();
console.log("Task2 started");
setTimeout(() => {
console.log("Task2 executed");
done.resolve();
},5000)
return done.promise;
}
});
let task3 = new taskbuffer.Task({
name:"Task 3",
taskFunction: () => {
let done = q.defer();
console.log("Task3 started");
setTimeout(() => {
console.log("Task3 executed");
done.resolve();
},5000)
return done.promise;
}
});
it("should run in Parallel",function(done){
this.timeout("7000"); this.timeout("7000");
let testTaskparallel = new taskbuffer.Taskparallel({ let testTaskparallel = new taskbuffer.Taskparallel({
taskArray:[task1,task2,task3] taskArray: [task1, task2, task3]
}); });
testTaskparallel.trigger().then(() => { testTaskparallel.trigger().then(() => {
done(); done();

View File

@ -1,17 +1,17 @@
import plugins = require("./taskbuffer.plugins"); import plugins = require("./taskbuffer.plugins");
import {Task,ITaskFunction} from "./taskbuffer.classes.task"; import { Task, ITaskFunction } from "./taskbuffer.classes.task";
export let emptyTaskFunction:ITaskFunction = function(){ export let emptyTaskFunction: ITaskFunction = function () {
let done = plugins.Q.defer(); let done = plugins.Q.defer();
done.resolve(); done.resolve();
return done.promise; return done.promise;
}; };
export let isTask = function(taskArg):boolean{ export let isTask = function (taskArg): boolean {
if( if (
taskArg instanceof Task taskArg instanceof Task
&& typeof taskArg.task === "function" && typeof taskArg.task === "function"
){ ) {
return true; return true;
} else { } else {
return false; return false;
@ -19,32 +19,32 @@ export let isTask = function(taskArg):boolean{
}; };
export let isTaskTouched = (taskArg:Task, touchedTasksArray:Task[]):boolean => { export let isTaskTouched = (taskArg: Task, touchedTasksArray: Task[]): boolean => {
let result = false; let result = false;
for (let keyArg in touchedTasksArray){ for (let keyArg in touchedTasksArray) {
if(taskArg === touchedTasksArray[keyArg]){ if (taskArg === touchedTasksArray[keyArg]) {
result = true; result = true;
} }
} }
return result; return result;
} }
export let runTask = function(taskArg:Task,optionsArg:{touchedTasksArray:Task[]} = {touchedTasksArray:[]}){ export let runTask = function (taskArg: Task, optionsArg: { touchedTasksArray: Task[] } = { touchedTasksArray: [] }) {
let done = plugins.Q.defer(); let done = plugins.Q.defer();
taskArg.running = true; taskArg.running = true;
done.promise.then(function(){taskArg.running = false}); done.promise.then(function () { taskArg.running = false });
let localDeferred = plugins.Q.defer(); let localDeferred = plugins.Q.defer();
let touchedTasksArray:Task[]; let touchedTasksArray: Task[];
if(optionsArg.touchedTasksArray){ if (optionsArg.touchedTasksArray) {
touchedTasksArray = optionsArg.touchedTasksArray; touchedTasksArray = optionsArg.touchedTasksArray;
} else { } else {
touchedTasksArray = []; touchedTasksArray = [];
} }
touchedTasksArray.push(taskArg); touchedTasksArray.push(taskArg);
localDeferred.promise localDeferred.promise
.then(() =>{ .then(() => {
if(taskArg.preTask && !isTaskTouched(taskArg.preTask,touchedTasksArray)){ if (taskArg.preTask && !isTaskTouched(taskArg.preTask, touchedTasksArray)) {
return runTask(taskArg.preTask,{touchedTasksArray:touchedTasksArray}) return runTask(taskArg.preTask, { touchedTasksArray: touchedTasksArray })
} else { } else {
let done2 = plugins.Q.defer(); let done2 = plugins.Q.defer();
done2.resolve(); done2.resolve();
@ -55,8 +55,8 @@ export let runTask = function(taskArg:Task,optionsArg:{touchedTasksArray:Task[]}
return taskArg.task(); return taskArg.task();
}) })
.then(() => { .then(() => {
if(taskArg.afterTask && !isTaskTouched(taskArg.afterTask,touchedTasksArray)){ if (taskArg.afterTask && !isTaskTouched(taskArg.afterTask, touchedTasksArray)) {
return runTask(taskArg.afterTask,{touchedTasksArray:touchedTasksArray}) return runTask(taskArg.afterTask, { touchedTasksArray: touchedTasksArray })
} else { } else {
let done2 = plugins.Q.defer(); let done2 = plugins.Q.defer();
done2.resolve(); done2.resolve();
@ -70,15 +70,79 @@ export let runTask = function(taskArg:Task,optionsArg:{touchedTasksArray:Task[]}
return done.promise; return done.promise;
}; };
export let runBufferedTask = (taskArg:Task) => {
let recursiveBufferRunner = () => { export interface cycleObject {
if(taskArg.bufferCounter > 0){ cycleCounter:number,
taskArg.runningBuffered = true; deferred:plugins.Q.Deferred<any>
taskArg.bufferCounter--; }
runTask(taskArg)
.then(recursiveBufferRunner); export class CycleCounter {
} else { task:Task;
taskArg.runningBuffered = false; cycleObjectArray:cycleObject[] = [];
} constructor(taskArg:Task){
this.task = taskArg;
};
getPromiseForCycle(cycleCountArg:number){
let done = plugins.Q.defer();
let cycleObject:cycleObject = {
cycleCounter:cycleCountArg,
deferred:done
};
this.cycleObjectArray.push(cycleObject);
return done.promise;
};
informOfCycle(){
let newCycleObjectArray:cycleObject[] = [];
this.cycleObjectArray.forEach(cycleObjectArg => {
cycleObjectArg.cycleCounter--;
if(cycleObjectArg.cycleCounter <= 0){
cycleObjectArg.deferred.resolve();
} else {
newCycleObjectArray.push(cycleObjectArg);
};
});
this.cycleObjectArray = newCycleObjectArray;
} }
}
export class BufferRunner {
task:Task;
// initialze by default
bufferCounter:number = 0;
bufferMax:number = 1;
running:boolean = false;
constructor(taskArg: Task) {
this.task = taskArg;
};
private _run() {
let recursiveBufferRunner = () => {
if (this.bufferCounter >= 0) {
this.running = true;
this.task.running = true;
runTask(this.task)
.then(() => {
this.bufferCounter--;
this.task.cycleCounter.informOfCycle();
recursiveBufferRunner();
});
} else {
this.running = false;
this.task.running = false;
}
};
recursiveBufferRunner();
};
setBufferMax(bufferMaxArg:number){
this.bufferMax = bufferMaxArg;
};
trigger(): PromiseLike<any> {
if(!(this.bufferCounter >= this.bufferMax)){
this.bufferCounter++
};
let returnPromise:PromiseLike<any> = this.task.cycleCounter.getPromiseForCycle(this.bufferCounter + 1);
if(!this.running){
this._run();
}
return returnPromise;
};
}; };

View File

@ -9,17 +9,17 @@ export interface ITaskFunction {
export class Task { export class Task {
name:string; name:string;
task:any; task:any;
running:boolean = false; buffered:boolean;
runningBuffered:boolean = false;
idle:boolean = true;
buffered:boolean = false;
bufferCounter:number;
bufferMax:number = 1;
private _counterTriggerAbsolute:number = 0;
private _state:string;
preTask:Task; preTask:Task;
afterTask:Task; afterTask:Task;
// initialize by default
running:boolean = false;
bufferRunner = new helpers.BufferRunner(this);
cycleCounter = new helpers.CycleCounter(this);
idle:boolean = true;
private _state:string = "ready";
constructor(optionsArg:{ constructor(optionsArg:{
taskFunction:ITaskFunction, taskFunction:ITaskFunction,
preTask?:Task, preTask?:Task,
@ -32,10 +32,9 @@ export class Task {
this.task = optionsArg.taskFunction; this.task = optionsArg.taskFunction;
this.preTask = options.preTask; this.preTask = options.preTask;
this.afterTask = options.afterTask; this.afterTask = options.afterTask;
this.running = false; this.idle = !this.running;
this.idle = !this.running && !this.runningBuffered;
this.buffered = options.buffered; this.buffered = options.buffered;
this.bufferMax = options.bufferMax; this.bufferRunner.setBufferMax(options.bufferMax);
this.name = options.name; this.name = options.name;
} }
@ -58,22 +57,15 @@ export class Task {
/** /**
* trigger task unbuffered. * trigger task unbuffered.
*/ */
triggerUnBuffered(){ triggerUnBuffered():PromiseLike<any>{
return helpers.runTask(this); return helpers.runTask(this);
} }
/** /**
* trigger task buffered. * trigger task buffered.
*/ */
triggerBuffered(){ triggerBuffered():PromiseLike<any>{
var done = plugins.Q.defer(); return this.bufferRunner.trigger();
if(!(this.bufferCounter >= this.bufferMax)){
this.bufferCounter++
};
if(!this.runningBuffered){
helpers.runBufferedTask(this);
};
return done.promise;
} }
get state():string { get state():string {