SlideShare a Scribd company logo
ZONE.JS
DEEP DIVE
A B O U T M E
{
"name": "Ilia Idakiev",
"experience": [
“Google Developer Expert (GDE)“,
"Developer & Co-founder @ HILLGRAND",
"Lecturer in 'Advanced JS' @ Sofia University",
"Contractor / Consultant",
"Public / Private Courses”
],
"involvedIn": [
"Angular Sofia", "SofiaJS / BeerJS",
]
}
The Event Loop 😬
Macrotask Queue
STACK
Macrotask Queue
STACK
Macrotask Queue
STACK
Macrotask Queue
STACK
Macrotask Queue
STACK
JS enginesetTimeout(…)
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
Macrotask Queue
STACK
JS engine
STACK
Macrotask Queue
JS engine
STACK
Macrotask Queue
Promise.resolve().then(fn) JS engine
STACK
Macrotask Queue
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
setTimeout(…, 0) JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
requestAnimationFrame(…) JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
Promise.resolve().then(fn) JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
Macrotask Queue
STACK
Microtask Queue
Request Animation Frame Queue
JS engine
! Micro Tasks - A microtask is work which will execute as soon as possible on empty stack frame. A
microtask is guaranteed to run before host environment performs rendering or I/O operations. A
microtask queue must be empty before another MacroTask or EventTask runs.

(i.e. Promise.then() executes in microtask)
! Macro Tasks - Macro tasks are interleaved with rendering and I/O operations of the host environment.
(ie setTimeout, setInterval, etc..). Macro tasks are guaranteed to run at least once or canceled
(some can run repeatedly such as setInterval). Macro tasks have an implied execution order.
! Event Tasks - Event tasks are similar to macro tasks, but unlike macro tasks they may never
run. Event tasks are scheduled using addEventListener('click', eventCallback), or similar mechanisms.
Tasks
What is a zone? 😒
A zone is an execution context that persists across async tasks, and allows
the creator of the zone to observe and control the execution of the code
within the zone.
Zone
Why do we need it? 🤔
! Knowing when a task has executed and when the micro task queue is empty allows frameworks to know
when it’s time to re-render the UIs.
! Enforcing that no tasks are scheduled allows test frameworks to ensure that the tests are synchronous and
fast (controlling time).
! Tracking when all scheduled tasks are executed allows a test framework to know when an async test has
completed.
! Long stack traces between async operations.
! Measuring latency for user operations (Profiling).
! And many more…
Use Cases
How does it work? 🤔
The zone library ships with code which monkey patches all of the browsers's
asynchronous API and redirects them through the zone for interception.
Zone.js
Monkey Patching 🐒
const originalSetTimeout = global.setTimeout;
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
}
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
  return originalSetTimeout(...args);
}
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
  return originalSetTimeout(...args);
}
setTimeout(function () {
  console.log('Hello!')
}, 0);
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (...args) {
  console.log('Timeout was called');
  return originalSetTimeout(...args);
}
setTimeout(function () {
  console.log('Hello!')
}, 0);
// > 'Timeout was called'
// > 'Hello!'
BROWSER
ZONE.JS
setTimeout Promise.resolve().then
Working with Zones 😬
const rootZone = Zone.current;
const rootZone = Zone.current;
const myZone = rootZone.fork({ 
  name: 'myZone', 
  properties: { user: null, debug: false } 
});
myZone.run(() => {
  console.log(Zone.current.name);
  // > 'myZone' (get the name of the current zone)
  console.log(Zone.current.get('user'));
  // > null (get the poperty called user)
  console.log(Zone.current.parent.name)
  // > '<root>' (get the name of the root zone)
});
myZone.run(() => {
  console.log(Zone.current.name);
  // > 'myZone' (get the name of the current zone)
  console.log(Zone.current.get('user'));
  // > null (get the poperty called user)
  console.log(Zone.current.parent.name)
  // > '<root>' (get the name of the root zone)
});
myZone.run(() => {
...
  const myZoneChild = myZone.fork({
    name: 'MyZoneChild',
    properties: { user: { name: 'Ivan' } }
  });
  
});
myZone.run(() => {
...
  const myZoneChild = myZone.fork({
    name: 'MyZoneChild',
    properties: { user: { name: 'Ivan' } }
  });
  myZoneChild.run(() => {
    
  });
});
myZone.run(() => {
...
  const myZoneChild = myZone.fork({
    name: 'MyZoneChild',
    properties: { user: { name: 'Ivan' } }
  });
  myZoneChild.run(() => {
    console.log(Zone.current.name); 
    // > 'myZoneChild' (get the name of the current zone)
    console.log(Zone.current.get('user')); 
    // > { name: 'Ivan' } (get the property called user)
    console.log(Zone.current.get('debug')); 
    // > false (get the property called user)
    console.log(Zone.current.parent.name) 
    // > 'MyZone' (get the name of the parent zone)
  });
});
! Each stack frame is associated with one zone (execution context).
! Data attached to the zone is shallow immutable.
! Once the zone is forked its properties cannot be changed.
! Child zones inherit parent zones properties (we can use them for communication).
Zones Basics Summary
Intercepting zones 😬
const timingZone = Zone.current.fork({
  name: 'timingZone',
  
});
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
    parentZoneDelegate.invoke(targetZone, callback, applyThis, applyArgs, source);
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
    parentZoneDelegate.invoke(targetZone, callback, applyThis, applyArgs, source);
    var end = performance.now();
    
  }
});
import { performance } from 'perf_hooks';
const timingZone = Zone.current.fork({
  name: 'timingZone',
  onInvoke: function (
    parentZoneDelegate, currentZone,
    targetZone, callback, applyThis,
    applyArgs, source
  ) {
    var start = performance.now();
    parentZoneDelegate.invoke(targetZone, callback, applyThis, applyArgs, source);
    var end = performance.now();
    console.log(
      'Zone:', targetZone.name,
      'Intercepting zone:', currentZone.name,
      'Duration:', end - start
    );
  }
});
const appZone = timingZone.fork({ name: 'appZome' });
const appZone = timingZone.fork({ name: 'appZome' });
appZone.run(function myApp() {
});
const appZone = timingZone.fork({ name: 'appZome' });
appZone.run(function myApp() {
  console.log('Zone:', Zone.current.name, 'Hello World!')
});
const appZone = timingZone.fork({ name: 'appZome' });
appZone.run(function myApp() {
  console.log('Zone:', Zone.current.name, 'Hello World!')
});
// Output: 
// > Zone: appZone Hello World!
// > Zone: appZone Intercepting zone: timingZone Duration: 919.128399014473
! We can intercept zone.run using the onInvoke hook and delegate.invoke inside.
! We can intercept zone.wrap using the onIntercept hook and delegate.intercept inside.
! We can intercept zone.form using the onFork hook and delegate.fork inside.
! We can’t use inheritance because the Zone.current is dynamic and we can’t know it on define time so we
need to use hooks and delegates.
! We can’t simply call a parent zone method because doing so would create a callback which is bound to
the parent zone and we are interested in intercepting the callback before it is bound to any zone so we
need to use hooks and delegates.
Zones Interception Summary
! Zone composition
! Observability of task execution
! Centralised error handling
Zones Interception Benefits
Scheduling tasks 😬
const originalSetTimeout = global.setTimeout;
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
    },
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
    },
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
    }
  );
  return task;
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  const task = Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
  return task;
};
const task = setTimeout(function () {
  console.log(123);
}, 1000);
// > task start
// > 123
// > task end
What if we want to clear the
timeout? 🤔
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
 originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      id = originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
const originalClearTimeout = global.clearTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      id = originalSetTimeout(
        task.invoke,
        delay
      );
    }
  );
};
const originalSetTimeout = global.setTimeout;
const originalClearTimeout = global.clearTimeout;
global.setTimeout = function (callback, delay) {
  let id;
  return Zone.current.scheduleMacroTask(
    'setTimeout',
    function () {
      callback();
      console.log('task end');
    },
    null,
    task => {
      console.log('task start');
      id = originalSetTimeout(
        task.invoke,
        delay
      );
    },
    () => originalClearTimeout(id)
  );
};
But aren’t we returning a task? 

How will clearTimeout work?
🤔
global.clearTimeout = function (task) {
  Zone.current.cancelTask(task);
}
global.clearTimeout = function (task) {
  Zone.current.cancelTask(task);
}
const task = setTimeout(function () {
  console.log(123);
}, 1000);
clearTimeout(task);
! We can scheduleMacroTask, scheduleMicroTask, scheduleEventTask and
scheduleTask (mostly useful for existing task when they were cancelled and we want to
reschedule them).
! We can intercept task scheduling with onScheduleTask, onInvokeTask, onCancelTask,
onHasTask, onHandleError.
! Task Lifecycle
Zones Tasks Summary
Why is the interception API
so confusing? 🤔
! We can’t use inheritance because the Zone.current is dynamic and we can’t know it on
define time so we need to use hooks and delegates.
! We can’t simply call a parent zone method because doing so would create a callback
which is bound to the parent zone and we are interested in intercepting the callback before it is
bound to any zone so we need to use hooks and delegates.
Why do we need hooks and delegates?
DEMO TIME
(Custom Change Detection Implementation)
! async-listener - a similar library for node
! vizone - control flow visualizer that uses zone.js
Additional Resources
THANK YOU!
GitHub > https://github.com/iliaidakiev (/slides/ - list of future and past events)
Twitter > @ilia_idakiev

More Related Content

Similar to Deep Dive into Zone.JS

Developing Async Sense
Developing Async SenseDeveloping Async Sense
Developing Async Sense
Nemanja Stojanovic
 
Event Loop in Javascript
Event Loop in JavascriptEvent Loop in Javascript
Event Loop in Javascript
DiptiGandhi4
 
JavaScript Async for Effortless UX
JavaScript Async for Effortless UXJavaScript Async for Effortless UX
JavaScript Async for Effortless UX
재석 강
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
MongoDB
 
Kotlin from-scratch 3 - coroutines
Kotlin from-scratch 3 - coroutinesKotlin from-scratch 3 - coroutines
Kotlin from-scratch 3 - coroutines
Franco Lombardo
 
A More Flash Like Web?
A More Flash Like Web?A More Flash Like Web?
A More Flash Like Web?
Murat Can ALPAY
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
Oleg Podsechin
 
HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?
Ankara JUG
 
Kotlin Coroutines and Rx
Kotlin Coroutines and RxKotlin Coroutines and Rx
Kotlin Coroutines and Rx
Shaul Rosenzwieg
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless
KatyShimizu
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
KatyShimizu
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
NodeXperts
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathon
Luciano Mammino
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
Frank Lyaruu
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
Ricardo Silva
 
Scaling Web Apps with Akka
Scaling Web Apps with AkkaScaling Web Apps with Akka
Scaling Web Apps with Akka
Maciej Matyjas
 
Akka lsug skills matter
Akka lsug skills matterAkka lsug skills matter
Akka lsug skills matter
Skills Matter
 
Asynchronous development in JavaScript
Asynchronous development  in JavaScriptAsynchronous development  in JavaScript
Asynchronous development in JavaScript
Amitai Barnea
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
David Padbury
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
soft-shake.ch
 

Similar to Deep Dive into Zone.JS (20)

Developing Async Sense
Developing Async SenseDeveloping Async Sense
Developing Async Sense
 
Event Loop in Javascript
Event Loop in JavascriptEvent Loop in Javascript
Event Loop in Javascript
 
JavaScript Async for Effortless UX
JavaScript Async for Effortless UXJavaScript Async for Effortless UX
JavaScript Async for Effortless UX
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Kotlin from-scratch 3 - coroutines
Kotlin from-scratch 3 - coroutinesKotlin from-scratch 3 - coroutines
Kotlin from-scratch 3 - coroutines
 
A More Flash Like Web?
A More Flash Like Web?A More Flash Like Web?
A More Flash Like Web?
 
JS everywhere 2011
JS everywhere 2011JS everywhere 2011
JS everywhere 2011
 
HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?HTML5 - Daha Flash bir web?
HTML5 - Daha Flash bir web?
 
Kotlin Coroutines and Rx
Kotlin Coroutines and RxKotlin Coroutines and Rx
Kotlin Coroutines and Rx
 
[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless
 
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
An opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathonAn opinionated intro to Node.js - devrupt hospitality hackathon
An opinionated intro to Node.js - devrupt hospitality hackathon
 
The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016The Road To Reactive with RxJava JEEConf 2016
The Road To Reactive with RxJava JEEConf 2016
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
 
Scaling Web Apps with Akka
Scaling Web Apps with AkkaScaling Web Apps with Akka
Scaling Web Apps with Akka
 
Akka lsug skills matter
Akka lsug skills matterAkka lsug skills matter
Akka lsug skills matter
 
Asynchronous development in JavaScript
Asynchronous development  in JavaScriptAsynchronous development  in JavaScript
Asynchronous development in JavaScript
 
JavaScript Growing Up
JavaScript Growing UpJavaScript Growing Up
JavaScript Growing Up
 
soft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.jssoft-shake.ch - Hands on Node.js
soft-shake.ch - Hands on Node.js
 

More from Ilia Idakiev

No more promises lets RxJS 2 Edit
No more promises lets RxJS 2 EditNo more promises lets RxJS 2 Edit
No more promises lets RxJS 2 Edit
Ilia Idakiev
 
Enterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platformEnterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platform
Ilia Idakiev
 
RxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling TimeRxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling Time
Ilia Idakiev
 
Creating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlCreating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-html
Ilia Idakiev
 
No More Promises! Let's RxJS!
No More Promises! Let's RxJS!No More Promises! Let's RxJS!
No More Promises! Let's RxJS!
Ilia Idakiev
 
Marble Testing RxJS streams
Marble Testing RxJS streamsMarble Testing RxJS streams
Marble Testing RxJS streams
Ilia Idakiev
 
Deterministic JavaScript Applications
Deterministic JavaScript ApplicationsDeterministic JavaScript Applications
Deterministic JavaScript Applications
Ilia Idakiev
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components Everywhere
Ilia Idakiev
 
Building Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularBuilding Reusable Custom Elements With Angular
Building Reusable Custom Elements With Angular
Ilia Idakiev
 
State management for enterprise angular applications
State management for enterprise angular applicationsState management for enterprise angular applications
State management for enterprise angular applications
Ilia Idakiev
 
Offline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and ReactOffline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and React
Ilia Idakiev
 
Testing rx js using marbles within angular
Testing rx js using marbles within angularTesting rx js using marbles within angular
Testing rx js using marbles within angular
Ilia Idakiev
 
Predictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platformPredictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platform
Ilia Idakiev
 
Angular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of SpeedAngular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of Speed
Ilia Idakiev
 
Angular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJSAngular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJS
Ilia Idakiev
 
Introduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web ApplicationsIntroduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web Applications
Ilia Idakiev
 
Reflective injection using TypeScript
Reflective injection using TypeScriptReflective injection using TypeScript
Reflective injection using TypeScript
Ilia Idakiev
 
Predictable reactive state management - ngrx
Predictable reactive state management - ngrxPredictable reactive state management - ngrx
Predictable reactive state management - ngrx
Ilia Idakiev
 

More from Ilia Idakiev (18)

No more promises lets RxJS 2 Edit
No more promises lets RxJS 2 EditNo more promises lets RxJS 2 Edit
No more promises lets RxJS 2 Edit
 
Enterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platformEnterprise State Management with NGRX/platform
Enterprise State Management with NGRX/platform
 
RxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling TimeRxJS Schedulers - Controlling Time
RxJS Schedulers - Controlling Time
 
Creating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlCreating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-html
 
No More Promises! Let's RxJS!
No More Promises! Let's RxJS!No More Promises! Let's RxJS!
No More Promises! Let's RxJS!
 
Marble Testing RxJS streams
Marble Testing RxJS streamsMarble Testing RxJS streams
Marble Testing RxJS streams
 
Deterministic JavaScript Applications
Deterministic JavaScript ApplicationsDeterministic JavaScript Applications
Deterministic JavaScript Applications
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components Everywhere
 
Building Reusable Custom Elements With Angular
Building Reusable Custom Elements With AngularBuilding Reusable Custom Elements With Angular
Building Reusable Custom Elements With Angular
 
State management for enterprise angular applications
State management for enterprise angular applicationsState management for enterprise angular applications
State management for enterprise angular applications
 
Offline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and ReactOffline progressive web apps with NodeJS and React
Offline progressive web apps with NodeJS and React
 
Testing rx js using marbles within angular
Testing rx js using marbles within angularTesting rx js using marbles within angular
Testing rx js using marbles within angular
 
Predictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platformPredictable reactive state management for enterprise apps using NGRX/platform
Predictable reactive state management for enterprise apps using NGRX/platform
 
Angular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of SpeedAngular server side rendering with NodeJS - In Pursuit Of Speed
Angular server side rendering with NodeJS - In Pursuit Of Speed
 
Angular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJSAngular Offline Progressive Web Apps With NodeJS
Angular Offline Progressive Web Apps With NodeJS
 
Introduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web ApplicationsIntroduction to Offline Progressive Web Applications
Introduction to Offline Progressive Web Applications
 
Reflective injection using TypeScript
Reflective injection using TypeScriptReflective injection using TypeScript
Reflective injection using TypeScript
 
Predictable reactive state management - ngrx
Predictable reactive state management - ngrxPredictable reactive state management - ngrx
Predictable reactive state management - ngrx
 

Recently uploaded

RESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for studentsRESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for students
KAMESHS29
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
Matthew Sinclair
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
Edge AI and Vision Alliance
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
Neo4j
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Speck&Tech
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
danishmna97
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
Uni Systems S.M.S.A.
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
mikeeftimakis1
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
SOFTTECHHUB
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Zilliz
 
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Malak Abu Hammad
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
Matthew Sinclair
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
DianaGray10
 

Recently uploaded (20)

RESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for studentsRESUME BUILDER APPLICATION Project for students
RESUME BUILDER APPLICATION Project for students
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
 
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024GraphSummit Singapore | The Art of the  Possible with Graph - Q2 2024
GraphSummit Singapore | The Art of the Possible with Graph - Q2 2024
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 
Introduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - CybersecurityIntroduction to CHERI technology - Cybersecurity
Introduction to CHERI technology - Cybersecurity
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
 
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdfUnlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
Unlock the Future of Search with MongoDB Atlas_ Vector Search Unleashed.pdf
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
 

Deep Dive into Zone.JS