Reschedule all functions for a tick before executing any
- This allows any function run during a tick to cancel any other in the same tick. Fixes #708
This commit is contained in:
@@ -1244,6 +1244,12 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
|
|||||||
scheduledFn.runAtMillis + scheduledFn.millis);
|
scheduledFn.runAtMillis + scheduledFn.millis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function forEachFunction(funcsToRun, callback) {
|
||||||
|
for (var i = 0; i < funcsToRun.length; ++i) {
|
||||||
|
callback(funcsToRun[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function runScheduledFunctions(endTime) {
|
function runScheduledFunctions(endTime) {
|
||||||
if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
|
if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
|
||||||
return;
|
return;
|
||||||
@@ -1255,15 +1261,15 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
|
|||||||
var funcsToRun = scheduledFunctions[currentTime];
|
var funcsToRun = scheduledFunctions[currentTime];
|
||||||
delete scheduledFunctions[currentTime];
|
delete scheduledFunctions[currentTime];
|
||||||
|
|
||||||
for (var i = 0; i < funcsToRun.length; ++i) {
|
forEachFunction(funcsToRun, function(funcToRun) {
|
||||||
var funcToRun = funcsToRun[i];
|
|
||||||
|
|
||||||
if (funcToRun.recurring) {
|
if (funcToRun.recurring) {
|
||||||
reschedule(funcToRun);
|
reschedule(funcToRun);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
forEachFunction(funcsToRun, function(funcToRun) {
|
||||||
funcToRun.funcToCall.apply(null, funcToRun.params || []);
|
funcToRun.funcToCall.apply(null, funcToRun.params || []);
|
||||||
}
|
});
|
||||||
} while (scheduledLookup.length > 0 &&
|
} while (scheduledLookup.length > 0 &&
|
||||||
// checking first if we're out of time prevents setTimeout(0)
|
// checking first if we're out of time prevents setTimeout(0)
|
||||||
// scheduled in a funcToRun from forcing an extra iteration
|
// scheduled in a funcToRun from forcing an extra iteration
|
||||||
|
|||||||
@@ -255,5 +255,42 @@ describe("DelayedFunctionScheduler", function() {
|
|||||||
scheduler.tick(10);
|
scheduler.tick(10);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("removes functions during a tick that runs the function", function() {
|
||||||
|
var scheduler = new j$.DelayedFunctionScheduler(),
|
||||||
|
fn = jasmine.createSpy('fn'),
|
||||||
|
fnDelay = 10,
|
||||||
|
timeoutKey;
|
||||||
|
|
||||||
|
timeoutKey = scheduler.scheduleFunction(fn, fnDelay, [], true);
|
||||||
|
scheduler.scheduleFunction(function () {
|
||||||
|
scheduler.removeFunctionWithId(timeoutKey);
|
||||||
|
}, 2 * fnDelay);
|
||||||
|
|
||||||
|
expect(fn).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
scheduler.tick(3 * fnDelay);
|
||||||
|
|
||||||
|
expect(fn).toHaveBeenCalled();
|
||||||
|
expect(fn.calls.count()).toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("removes functions during the first tick that runs the function", function() {
|
||||||
|
var scheduler = new j$.DelayedFunctionScheduler(),
|
||||||
|
fn = jasmine.createSpy('fn'),
|
||||||
|
fnDelay = 10,
|
||||||
|
timeoutKey;
|
||||||
|
|
||||||
|
timeoutKey = scheduler.scheduleFunction(fn, fnDelay, [], true);
|
||||||
|
scheduler.scheduleFunction(function () {
|
||||||
|
scheduler.removeFunctionWithId(timeoutKey);
|
||||||
|
}, fnDelay);
|
||||||
|
|
||||||
|
expect(fn).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
scheduler.tick(3 * fnDelay);
|
||||||
|
|
||||||
|
expect(fn).toHaveBeenCalled();
|
||||||
|
expect(fn.calls.count()).toBe(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -114,6 +114,12 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
|
|||||||
scheduledFn.runAtMillis + scheduledFn.millis);
|
scheduledFn.runAtMillis + scheduledFn.millis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function forEachFunction(funcsToRun, callback) {
|
||||||
|
for (var i = 0; i < funcsToRun.length; ++i) {
|
||||||
|
callback(funcsToRun[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function runScheduledFunctions(endTime) {
|
function runScheduledFunctions(endTime) {
|
||||||
if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
|
if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
|
||||||
return;
|
return;
|
||||||
@@ -125,15 +131,15 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
|
|||||||
var funcsToRun = scheduledFunctions[currentTime];
|
var funcsToRun = scheduledFunctions[currentTime];
|
||||||
delete scheduledFunctions[currentTime];
|
delete scheduledFunctions[currentTime];
|
||||||
|
|
||||||
for (var i = 0; i < funcsToRun.length; ++i) {
|
forEachFunction(funcsToRun, function(funcToRun) {
|
||||||
var funcToRun = funcsToRun[i];
|
|
||||||
|
|
||||||
if (funcToRun.recurring) {
|
if (funcToRun.recurring) {
|
||||||
reschedule(funcToRun);
|
reschedule(funcToRun);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
forEachFunction(funcsToRun, function(funcToRun) {
|
||||||
funcToRun.funcToCall.apply(null, funcToRun.params || []);
|
funcToRun.funcToCall.apply(null, funcToRun.params || []);
|
||||||
}
|
});
|
||||||
} while (scheduledLookup.length > 0 &&
|
} while (scheduledLookup.length > 0 &&
|
||||||
// checking first if we're out of time prevents setTimeout(0)
|
// checking first if we're out of time prevents setTimeout(0)
|
||||||
// scheduled in a funcToRun from forcing an extra iteration
|
// scheduled in a funcToRun from forcing an extra iteration
|
||||||
|
|||||||
Reference in New Issue
Block a user