while (true) {
task = taskQueue.pop();
execute(task);
}
setTimeout(myCallback, 3000);
while (true) {
task = taskQueue.pop();
execute(task);
}
const worker = new Worker('job.js');
while (true) {
task = taskQueue.pop();
execute(task);
if (isRepaintTime()) repaint();
}
bool did_work = delegate->DoWork();
if (!keep_running_)
break;
did_work |= delegate->DoDelayedWork(&delayed_work_time_);
if (!keep_running_)
break;
if (did_work)
continue;
did_work = delegate->DoIdleWork();
if (!keep_running_)
break;
while (true) {
queue = getNextQueue();
task = queue.pop();
execute(task);
if (isRepaintTime()) repaint();
}
const observer = new MutationObserver(callback);
const myElement = document.getElementById('stegosaurus');
observer.observe(myElement, ({ subtree: true }));
const myPromise = new Promise((resolve, reject) => { ... });
myPromise.then(callback).catch(errorCallback);
window.queueMicrotask(callback);
while (true) {
queue = getNextQueue();
task = queue.pop();
execute(task);
while (microtaskQueue.hasTasks())
doMicrotask();
if (isRepaintTime()) repaint();
}
requestAnimationFrame(callback);
browser.classList.remove('slide');
requestAnimationFrame(() => {
browser.classList.add('slide');
});
while (true) {
queue = getNextQueue();
task = queue.pop();
execute(task);
while (microtaskQueue.hasTasks())
doMicrotask();
if (isRepaintTime()) {
animationTasks = animationQueue.copyTasks();
for (task in animationTasks)
doAnimationTask(task);
repaint();
}
}
<ul>
<li>Tyrannosaurus Rex</li>
<li>Velociraptor</li>
<li>Triceratops</li> <li>Brontosaurus</li></ul>
const dinosaurs = [
'Tyrannosaurus Rex',
'Velociraptor',
'Triceratops',
'Brontosaurus'
];
setState(updatedState);
const app = new Vue({
name: 'Dr Ellie Sattler'
});
Object.defineProperty(
app,
'items',
{ get: () => this._name,
set: (value) => {
this._name = value;
runChangeDetection();
}
}
);
A Zone is an execution context that persists across async tasks.
You can think of it as thread-local storage for JavaScript VMs.
A Zone is a mechanism for intercepting and keeping track of work.
In its simplest form a Zone allows one to intercept the scheduling and calling of asynchronous operations, and execute additional code before as well as after the asynchronous code.
window.setTimeout(callback, delay)
const nativeTimeout = window.setTimeout;
window.setTimeout =
function (callback, delay) {
nativeTimeout(() => {
preTaskCallback();
callback();
postTaskCallback();
}, delay);
}
const nativeTimeout = window.setTimeout;
window.setTimeout =
function (callback, delay) {
nativeTimeout(() => {
callback();
runChangeDetection();
}, delay);
}
platformBrowserDynamic().bootstrapModule(AppModule);
ngZone.run()
it('should add a new list item', () => {
component.dinosaurs.push('Brontosaurus');
expect(listItems[3]).toBe('Brontosaurus');
});
Expected undefined to be 'Brontosaurus'
fixture.detectChanges()
it('should add a new list item', (done) => {
component.dinosaurs.push('Brontosaurus');
fixture.detectChanges().then(() => {
expect(listItemElements[3]).toBe('Brontosaurus');
done();
});
});
it('should flush microtasks before returning', () => {
let thenRan = false;
fakeAsync(() => {
resolvedPromise.then(_ => { thenRan = true; });
})();
expect(thenRan).toEqual(true);
});
it('should add a new list item', fakeAsync((done) => { component.dinosaurs.push('Brontosaurus'); fixture.detectChanges().then(() => { expect(listItemElements[3]).toBe('Brontosaurus'); done(); }); }));
it('should do something after a promise resolves', fakeAsync(() => {
component.submit();
flushMicrotasks();
expect(dinosaurs).toContain('Torontosaurus');
}));
let count = 0;
function countUp() {
setTimeout(() => count++, 1000);
setTimeout(() => count++, 2000);
setTimeout(() => count++, 3000);
setTimeout(() => count++, 4000);
setTimeout(() => count++, 5000);
}
it('should count to 5 in five seconds', fakeAsync(() => {
countUp();
const timeElapsed = flush();
expect(count).toBe(5);
expect(timeElapsed).toBe(5000);
}));
setTimeout(callback, 1000)
setTimeout(callback, 2000)
setTimeout(callback, 3000)
setTimeout(callback, 4000)
setTimeout(callback, 5000)
setTimeout(callback, 1000)
setTimeout(callback, 2000)
setTimeout(callback, 3000)
setTimeout(callback, 4000)
setTimeout(callback, 5000)
this.zone.runOutsideAngular(() => {
paint();
});
this.zone.run(() => {
calculate();
});