Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
nikku committed Jul 4, 2024
1 parent a4ccc1f commit cf873ad
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 23 deletions.
57 changes: 38 additions & 19 deletions lib/features/scheduler/Scheduler.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,30 +52,49 @@ Scheduler.prototype.schedule = function(taskFn, id = Ids.next()) {

const newScheduled = this._schedule(taskFn, id);

if (this.DEBUG) {
console.log('Scheduler.schedule', { id, ...newScheduled });
}

this._scheduled[id] = newScheduled;

return newScheduled.promise;
};

Scheduler.prototype._schedule = function(taskFn, id) {

const {
promise,
resolve,
reject
} = defer();
const deferred = defer();

const executionId = requestAnimationFrame(() => {

try {
resolve(taskFn());
} catch (error) {
reject(error);
this._scheduled[id] = null;

if (this.DEBUG) {
console.log('Scheduler.exec', { id, executionId });
}

try {
deferred.resolve(taskFn());

if (this.DEBUG) {
console.log('Scheduler.executed', { id, executionId });
}
} catch (error) {
deferred.reject(error);
}
} catch (err) {
console.log(err);
}
});

if (this.DEBUG) {
console.log('Scheduler._schedule', { id, executionId });
}

return {
executionId,
promise
promise: deferred.promise
};
};

Expand All @@ -89,6 +108,11 @@ Scheduler.prototype.cancel = function(id) {
const scheduled = this._scheduled[id];

if (scheduled) {

if (this.DEBUG) {
console.log('Scheduler.cancel', { id, executionId: scheduled.executionId });
}

this._cancel(scheduled);

this._scheduled[id] = null;
Expand All @@ -108,17 +132,12 @@ Scheduler.prototype._cancel = function(scheduled) {
*/
function defer() {

let resolve;
let reject;
const deferred = {};

const promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
deferred.promise = new Promise((resolve, reject) => {
deferred.resolve = resolve;
deferred.reject = reject;
});

return {
promise,
resolve,
reject
};
return deferred;
}
21 changes: 17 additions & 4 deletions test/spec/features/scheduler/SchedulerSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ describe('features/scheduler', function() {
}));


beforeEach(inject(function(scheduler) {

scheduler.DEBUG = true;
}));


this.timeout(10000);

it('should schedule task', inject(async function(scheduler) {

// given
Expand All @@ -22,10 +30,15 @@ describe('features/scheduler', function() {
// when
const promise = scheduler.schedule(fn);


console.log('SCHEDULE TASK');

// assume
expect(fn).not.to.have.been.called;

// when
console.log('AWAIT SCHEDULED');

await promise;

// then
Expand Down Expand Up @@ -55,7 +68,7 @@ describe('features/scheduler', function() {

describe('execution behavior', function() {

it('should only execute latest task', inject(async function(scheduler) {
it.skip('should only execute latest task', inject(async function(scheduler) {

// given
const fn = sinon.spy();
Expand All @@ -73,7 +86,7 @@ describe('features/scheduler', function() {
}));


it('should return task result', inject(async function(scheduler) {
it.skip('should return task result', inject(async function(scheduler) {

// given
const fn = () => 10;
Expand All @@ -86,7 +99,7 @@ describe('features/scheduler', function() {
}));


it('should catch task error', inject(async function(scheduler) {
it.skip('should catch task error', inject(async function(scheduler) {

// given
const fn = () => {
Expand All @@ -108,7 +121,7 @@ describe('features/scheduler', function() {
}));


it('should cancel when diagram is destroyed', inject(
it.skip('should cancel when diagram is destroyed', inject(
async function(scheduler) {

// given
Expand Down

0 comments on commit cf873ad

Please sign in to comment.