{"id":8070,"date":"2019-12-02T08:13:19","date_gmt":"2019-12-02T08:13:19","guid":{"rendered":"https:\/\/www.arobs.com\/?p=8070"},"modified":"2022-01-07T09:08:11","modified_gmt":"2022-01-07T09:08:11","slug":"reactive-extensions-rx","status":"publish","type":"post","link":"https:\/\/arobs.com\/en\/blog\/reactive-extensions-rx\/","title":{"rendered":"Reactive extensions (Rx)"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"8070\" class=\"elementor elementor-8070\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-41678813 ot-traditional elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"41678813\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-25775bda ot-flex-column-vertical\" data-id=\"25775bda\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-edf6b2d elementor-widget elementor-widget-heading\" data-id=\"edf6b2d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Reactive extensions -\u00a0Introduction to reactive programming<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a00ac5f elementor-widget elementor-widget-spacer\" data-id=\"a00ac5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-59c5d06a elementor-widget elementor-widget-text-editor\" data-id=\"59c5d06a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Topics of this article<\/strong>: Rx, reactive programming, declarative programming, <span style=\"text-decoration: underline;\"><a href=\"https:\/\/arobs.com\/home-automation-system\/\">IoT systems<\/a><\/span>, IObservable, IObserver<\/p><p><strong>About the author:<\/strong> Bogdan Dobrea is an experienced .NET developer with a great curiosity towards discovering new technologies.<\/p><p>Reactive extensions can make your programming life easier. But how does it work? Let&#8217;s take it step by step. We all learned in school imperative programming, which has the advantage of being simple to explain and implement. This programming paradigm allows us to write a code where we describe, step by step, what we want to do. Hence, the result will be exactly predictable. It happens what we wanted to happen.<br \/>Let&#8217;s try to exemplify this using a real situation: an <strong>online store<\/strong>, where, through the browser, any user can look at products and place an order.<\/p><p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-8190 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/Reactive-extensions-1.jpg\" alt=\"Reactive extensions\" width=\"1252\" height=\"376\" \/><\/p><p>As an administrator of this online store, we would like to create an algorithm that returns the top \/&#8221;rich&#8221; customers: for example, we want to find out how many customers have in their basket products that total at least 1000 Ron.<\/p><p>In the code, our client will be associated with the <strong>Customer<\/strong> class. We only need 2 properties, its name <em>(Name)<\/em> and the total of its shopping cart, expressed by the <em>OrderAmount<\/em> property. For simplicity, we will use Romanian lei (Ron) when we refer to the total of the basket.<\/p><p>The following examples are written in C#, but the subject of the article is not limited to this language, as we will find out later.<\/p><p><img decoding=\"async\" class=\"alignnone wp-image-8201 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-1-1.png\" alt=\"Reactive extensions\" width=\"628\" height=\"307\" \/><\/p><p>Our premise is that at one point, in our private virtual space there are <strong>5 clients<\/strong>, each having a name as well as a basket of a certain value:<\/p><p><img decoding=\"async\" class=\"alignnone wp-image-8204 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-2.png\" alt=\"Reactive extensions\" width=\"627\" height=\"164\" \/><\/p><p>Our imperative algorithm, whereby we want to find out which of the 5 clients has spent at least 1000 RON could look like this:<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-8207\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-3.png\" alt=\"\" width=\"625\" height=\"246\" \/><\/p><p>In line with the definition of the imperative programming style mentioned at the beginning of the article, I described on each line, step by step, what I wanted to happen.<\/p><p>First, we created a new list of <em>topSpendersList<\/em>, then we went through the list of customers item by item, only interested in the name of the person whose shopping basket exceeds or is equal to 1000 Ron. At the end of the execution of this algorithm, we will notice that in the<em> topSpendersList<\/em> list we have 3 members (<em>&#8220;Felicia&#8221;<\/em>, <em>&#8220;Robert&#8221;<\/em> and <em>&#8220;Fred&#8221;<\/em>), because each of the 3 has spent at least 1000 Ron.<\/p><h2><span style=\"color: #00152d;\"><strong>Declarative programming<\/strong><\/span><\/h2><p>Everything was fine so far, we found out what we needed. Now let\u2019s see how we could rewrite this algorithm using the declarative programming model.<br \/>Declarative programming, in contrast to the imperative one, is a programming style in which the logic of a calculation is described, but without presenting the execution mode. Those familiar with .Net (C#, VB) already use this programming mode when writing code using LINQ:<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8210 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-4.png\" alt=\"Reactive extensions\" width=\"628\" height=\"108\" \/><\/p><p>In the lines of code above, the logic of a calculation is expressed (it selects from the customers list only the customers who have a value of the shopping cart at least equal to 1000 Ron, then using their name creates a new list), without having to write the action step by step. The source code for the <em>Where()<\/em>, <em>Select()<\/em> and <em>ToList()<\/em> functions is in the .NET Framework library.<br \/>The result of the execution of this algorithm will be the same as for the previous one. Therefore, the <em>topSpendersList<\/em> list will contain the same 3 members (<em>&#8220;Felicia&#8221;<\/em>, <em>&#8220;Robert&#8221;<\/em> and <em>&#8220;Fred&#8221;<\/em>).<\/p><h2><span style=\"color: #00152d;\"><strong>Reactive programming<\/strong><\/span><\/h2><p>What does reactive mean? A common dictionary tells us that it is about a reaction to a stimulus.<br \/>To explain it more familiarly, I will use the well-known Excel spreadsheet, where we can have static cells as well as dynamic cells (for example, a formula). In the screenshot below, in column A we enter static values, and the first 2 cells in column D have the calculation formula, respectively the average of the first 10 values in column A. As a bonus, we added a 2D Chart with the help of to which we will represent a graph with the values in column A.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8213 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-Excel-example-1.png\" alt=\"Reactive extensions\" width=\"651\" height=\"249\" \/><\/p><p>Each time we add, modify, or delete a value in a cell in column A, we notice that Sum, Average, and Graph 2D &#8220;reacts&#8221; to these changes.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8216 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-Excel-example-2.png\" alt=\"Reactive extensions\" width=\"651\" height=\"247\" \/><\/p><p>Returning to our example, suppose that every time a new client appears on the site, we want the <em>topSpendersList<\/em> list to update itself with the name of the new client if it meets the condition imposed by us.<\/p><p>The examples written above will no longer work, because they depend on a fixed customer list, while we now have a customer flow.<\/p><p>And <strong>here come Reactive Extensions<\/strong>, which is a free library with which we can rewrite our algorithm so that it takes into account the fact that it has to &#8220;react&#8221; every time we have a new client.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8219 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-5.png\" alt=\"Reactive extensions\" width=\"632\" height=\"352\" \/><\/p><p>Although there are more lines of code written than in the previous examples, we will find out that reactive extensions are easy to understand, and we will use this pattern often in the future.<\/p><p>Let&#8217;s take them one at a time:<\/p><ul><li><em>customersList <\/em>is now of the <strong>ObservableCollection<\/strong> We need this because this type of list will invoke an event called <em>CollectionChanged <\/em>every time we change the elements inside it;<\/li><li><em>FromEventPattern<\/em> creates a data flow from the <em>CollectionChanged<\/em> event that it listens to and drops us a new value each time we add a new client to the list;<\/li><li><em>SelectMany<\/em> returns a customer list extracted from the <em>NewItems<\/em> property of <em>NotifyCollectionChangedEventArgs;<\/em><\/li><li><em>Where <\/em>it is already known to us, it will filter new customers and will only return those who have spent at least 1000 Ron;<\/li><li>At this data flow, we must subscribe using the <em>Subscribe<\/em> In the body of this method, we decide what we do with the new client who respects our condition: we add it to the <em>topSpendersList<\/em>.<\/li><\/ul><p>If we run the new algorithm, without having any element in the <em>customersList<\/em>, we will see that nothing happens. As we add new elements, the algorithm will run and after its execution, <em>topSpendersList<\/em> will be populated.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8222 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-6.png\" alt=\"Reactive extensions\" width=\"633\" height=\"133\" \/><\/p><p>After adding the 5 initial customers, in the <em>topSpendersList <\/em>we will find the names of the last 3 customers.<\/p><p>But now<em> customersList<\/em> is no longer a fixed list, so after we add the next 5, our algorithm will &#8220;react&#8221; to this action and add 3 more people (Phil, Anastacia and Aurora) in the<em> topSpendersList<\/em>:<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8225 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-7.png\" alt=\"Reactive extensions\" width=\"629\" height=\"136\" \/><\/p><p><strong>Therefore, we can say that <em>reactive programming<\/em> is a model (paradigm) of declarative programming that focuses on data flows and the propagation of change.<\/strong><\/p><p>The new syntax, which uses <em>Observable<\/em> and <em>Subscribe<\/em> keywords, will be accessible after we add the <em>NuGet<\/em> package called <strong>System.Reactive.<\/strong><\/p><h2><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8228 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-library-example-1.png\" alt=\"Reactive extensions\" width=\"836\" height=\"361\" \/><\/h2><h2><span style=\"color: #00152d;\"><strong>IObservable and IObserver<\/strong><\/span><\/h2><p>To better understand the example of reactive code, we need to talk a little about the 2 interfaces. Their definition is in the .NET Framework since version 4.0. However, their implementation is not in the framework, but in the <em>System.Reactive <\/em>library.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8231 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/RX-example-8.png\" alt=\"Reactive extensions\" width=\"631\" height=\"367\" \/><\/p><p>The easiest way to explain things is to make an analogy with a real-life situation. This is what we did with the online store, so we will do the same here. Let&#8217;s look at <em>IObservable<\/em> as a treadmill, which receives products at one end, and transports them to the other end. The products can be of different sizes and colors and can reach the treadmill at different time intervals. If the treadmill is working and there is no one at the other end, they will fall on the floor and thus be lost.<\/p><figure id=\"attachment_8194\" aria-describedby=\"caption-attachment-8194\" style=\"width: 1252px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-8194 size-full\" src=\"https:\/\/www.arobs.com\/wp-content\/uploads\/2019\/12\/Reactive-extensions-2.jpg\" alt=\"Reactive extensions \" width=\"1252\" height=\"376\" \/><figcaption id=\"caption-attachment-8194\" class=\"wp-caption-text\">Reactive extensions<\/figcaption><\/figure><p>In order to prevent this from happening, we need a human operator to take those packages. In other words, it &#8220;subscribes&#8221; to the packet flow on the treadmill. The operator (or observer) implements the IObserver interface, which contains 3 methods: <em>OnNext<\/em>, <em>OnError,<\/em> and <em>OnCompleted<\/em>.<\/p><p>The observable(treadmill), from the moment it has a subscriber, will know how to use these methods as follows:<\/p><ul><li>Whenever we have a new product on the tape, it will call the <em>OnNext <\/em>method, and the parameter sent will be the product itself;<\/li><li>If a tread failure occurs, it will call the <em>OnError<\/em> From this moment, the connection between the tread and the operator is eliminated, and even if new products will be produced on the treadmill, the operator will not know about them;<\/li><li>After all, packages are sent, the tape will call <em>OnCompleted<\/em>, and again the connection between the treadmill and the operator will be eliminated. Even if products will appear again, just like <em>OnError<\/em>, the operator will not know about them.<\/li><\/ul><p>We notice that there is a close connection between <em>IObservable<\/em> and <em>IObserver<\/em>. Moreover, when we call <em>Subscribe<\/em>, <em>IObservable<\/em> will return an <em>IDisposable<\/em>, which is very useful, because when we no longer need this subscription, we simply call <em>Dispose() on its instance<\/em>. The <em>System.Reactive<\/em> library comes with another helper class called <em>CompositeDisposable<\/em>, in which we can add each subscription separately using the <em>Add()<\/em> method, and in the end, by calling <em>Clear()<\/em> at the <em>CompositeDisposable<\/em> instance, we remove all subscriptions, to assure the best memory management.<\/p><p>If we turn now to the reactive programming algorithm, we will realize that it makes more sense. For simplicity, in the body of the <em>Subscribe<\/em> method, we have written only a lambda expression that handles only the cases in which we have new clients <em>(OnNext).<\/em>\u00a0Not cases of an error <em>(OnError)<\/em>, nor is the situation in which the Observable calls <em>OnCompleted<\/em> when there are no new items.<\/p><p>Reactive extensions are also available for other programming languages, not just C#:<\/p><ul><li>Java (RxJava)<\/li><li>Javascript (RxJS)<\/li><li>C ++ (UniRx)<\/li><li>Ruby (Rx.rb)<\/li><li>Python (RxPY)<\/li><li>PHP (RxPHP)<\/li><li>Swift (RxSwift)<\/li><li>Dart (RxDart)<\/li><\/ul><p>See the official site, <a href=\"http:\/\/reactivex.io\"><span style=\"text-decoration: underline;\">here<\/span><\/a>.<\/p><h2><span style=\"color: #00152d;\"><strong>Conclusion<\/strong><\/span><\/h2><p>This was, in short, an introduction to reactive programming. Reactive extensions can help us write easy-to-understand, scalable algorithms. These provide us with a helping hand in memory management (via <em>CompositeDisposable<\/em>). Last but not least, they can be a real help in asynchronous programming. The examples presented are the basis of this reactive thinking.<\/p><p>Reactive extensions also provide us with some very useful operators. Here is their short definition:<\/p><ul><li><em>Skip()<\/em> &#8211; emits the first n elements of an observable structure<\/li><li><em>Merge()<\/em> &#8211; combines 2 or more observable streams<\/li><li><em>Throttle()<\/em> &#8211; issues a new item only if a certain time has elapsed without another item being issued<\/li><li><em>Map()<\/em> &#8211; transforms the current element, by applying a function to another element<\/li><li><em>Timer()<\/em> &#8211; a much easier way to write classic .Net timers<\/li><\/ul><h2><strong>Useful links:<\/strong><\/h2><ul><li>rectivex.io<\/li><li>rxmarbles.com<\/li><li>introtorx.com<\/li><li>github.com\/ReactiveX<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7d9c1428 ot-traditional elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7d9c1428\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-110dccd ot-flex-column-vertical\" data-id=\"110dccd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-66b0a680 elementor-widget elementor-widget-spacer\" data-id=\"66b0a680\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-30c578a8 elementor-section-full_width elementor-section-content-bottom ot-traditional elementor-section-height-default elementor-section-height-default\" data-id=\"30c578a8\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-extended\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-678d88be ot-flex-column-vertical\" data-id=\"678d88be\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-54a86fe elementor-widget elementor-widget-iheading\" data-id=\"54a86fe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"iheading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"ot-heading\">\r\n\t        <h5 class=\"main-heading\">Dare to try the AROBS experience!\n<\/h5>\t    <\/div>\r\n\t    \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3c69a419 elementor-align-center elementor-mobile-align-left elementor-widget elementor-widget-button\" data-id=\"3c69a419\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/careers-arobs.icims.com\/jobs\/search?ss=1&#038;hashed=-435624355\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Find your job<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-78aca4 elementor-section-full_width ot-traditional elementor-section-height-default elementor-section-height-default\" data-id=\"78aca4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-386684e5 ot-flex-column-vertical\" data-id=\"386684e5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-inner-section elementor-element elementor-element-295bfb9b elementor-section-full_width elementor-section-content-bottom ot-traditional elementor-section-height-default elementor-section-height-default\" data-id=\"295bfb9b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-inner-column elementor-element elementor-element-2c5a6a8b ot-flex-column-vertical\" data-id=\"2c5a6a8b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-71eec4d0 elementor-widget elementor-widget-iheading\" data-id=\"71eec4d0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"iheading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"ot-heading\">\r\n\t        \t            <span>\/\/ our recent news<\/span>\r\n\t        <h4 class=\"main-heading\">Read our recent blog posts<\/h4>\t    <\/div>\r\n\t    \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<div class=\"elementor-element elementor-element-2c3ee971 elementor-grid-3 elementor-grid-tablet-2 elementor-grid-mobile-1 elementor-posts--thumbnail-top elementor-posts--show-avatar elementor-card-shadow-yes elementor-posts__hover-gradient elementor-widget elementor-widget-posts\" data-id=\"2c3ee971\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;cards_columns&quot;:&quot;3&quot;,&quot;cards_columns_tablet&quot;:&quot;2&quot;,&quot;cards_columns_mobile&quot;:&quot;1&quot;,&quot;cards_row_gap&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:35,&quot;sizes&quot;:[]},&quot;cards_row_gap_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;cards_row_gap_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"posts.cards\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-posts-container elementor-posts elementor-posts--skin-cards elementor-grid\" role=\"list\">\n\t\t\t\t<article class=\"elementor-post elementor-grid-item post-23586 post type-post status-publish format-standard has-post-thumbnail hentry category-blog category-researchdevelopment\" role=\"listitem\">\n\t\t\t<div class=\"elementor-post__card\">\n\t\t\t\t<a class=\"elementor-post__thumbnail__link\" href=\"https:\/\/arobs.com\/en\/blog\/running-ai-where-the-cloud-cannot-reach-the-case-for-local-intelligence-in-embedded-systems\/\" tabindex=\"-1\" ><div class=\"elementor-post__thumbnail\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"283\" src=\"https:\/\/arobs.com\/wp-content\/uploads\/2026\/05\/AROBS-local-AI-embedded-systems-1024x283.png\" class=\"attachment-large size-large wp-image-23588\" alt=\"AROBS local AI embedded systems\" srcset=\"https:\/\/arobs.com\/wp-content\/uploads\/2026\/05\/AROBS-local-AI-embedded-systems-1024x283.png 1024w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/05\/AROBS-local-AI-embedded-systems-300x83.png 300w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/05\/AROBS-local-AI-embedded-systems-768x212.png 768w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/05\/AROBS-local-AI-embedded-systems-1536x424.png 1536w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/05\/AROBS-local-AI-embedded-systems-720x199.png 720w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/05\/AROBS-local-AI-embedded-systems.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/a>\n\t\t\t\t<div class=\"elementor-post__badge\">Blog<\/div>\n\t\t\t\t<div class=\"elementor-post__avatar\">\n\t\t\t<img alt='Diana-Maria Coste' src='https:\/\/secure.gravatar.com\/avatar\/629dfaf2fd12eaaf0729c8b4a5b3ecdb3b6d03c931801663083f12b80631f903?s=128&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/629dfaf2fd12eaaf0729c8b4a5b3ecdb3b6d03c931801663083f12b80631f903?s=256&#038;d=mm&#038;r=g 2x' class='avatar avatar-128 photo' height='128' width='128' \/>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-post__text\">\n\t\t\t\t<h3 class=\"elementor-post__title\">\n\t\t\t<a href=\"https:\/\/arobs.com\/en\/blog\/running-ai-where-the-cloud-cannot-reach-the-case-for-local-intelligence-in-embedded-systems\/\" >\n\t\t\t\tRunning AI Where the Cloud Cannot Reach: The case for local intelligence in embedded systems\t\t\t<\/a>\n\t\t<\/h3>\n\t\t\n\t\t<a class=\"elementor-post__read-more\" href=\"https:\/\/arobs.com\/en\/blog\/running-ai-where-the-cloud-cannot-reach-the-case-for-local-intelligence-in-embedded-systems\/\" aria-label=\"Read more about Running AI Where the Cloud Cannot Reach: The case for local intelligence in embedded systems\" tabindex=\"-1\" >\n\t\t\tRead More \u00bb\t\t<\/a>\n\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-post__meta-data\">\n\t\t\t\t\t<span class=\"elementor-post-author\">\n\t\t\tDiana-Maria Coste\t\t<\/span>\n\t\t\t\t<span class=\"elementor-post-date\">\n\t\t\tAugust 7, 2026\t\t<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/article>\n\t\t\t\t<article class=\"elementor-post elementor-grid-item post-23731 post type-post status-publish format-standard has-post-thumbnail hentry category-blog category-testimonial\" role=\"listitem\">\n\t\t\t<div class=\"elementor-post__card\">\n\t\t\t\t<a class=\"elementor-post__thumbnail__link\" href=\"https:\/\/arobs.com\/en\/blog\/bcr-x-arobs-driving-digital-banking-innovation\/\" tabindex=\"-1\" ><div class=\"elementor-post__thumbnail\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"283\" src=\"https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/bcr-x-AROBS-1024x283.png\" class=\"attachment-large size-large wp-image-24654\" alt=\"\" srcset=\"https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/bcr-x-AROBS-1024x283.png 1024w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/bcr-x-AROBS-300x83.png 300w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/bcr-x-AROBS-768x212.png 768w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/bcr-x-AROBS-1536x424.png 1536w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/bcr-x-AROBS-720x199.png 720w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/bcr-x-AROBS.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/a>\n\t\t\t\t<div class=\"elementor-post__badge\">Blog<\/div>\n\t\t\t\t<div class=\"elementor-post__avatar\">\n\t\t\t<img alt='Diana-Maria Coste' src='https:\/\/secure.gravatar.com\/avatar\/629dfaf2fd12eaaf0729c8b4a5b3ecdb3b6d03c931801663083f12b80631f903?s=128&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/629dfaf2fd12eaaf0729c8b4a5b3ecdb3b6d03c931801663083f12b80631f903?s=256&#038;d=mm&#038;r=g 2x' class='avatar avatar-128 photo' height='128' width='128' \/>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-post__text\">\n\t\t\t\t<h3 class=\"elementor-post__title\">\n\t\t\t<a href=\"https:\/\/arobs.com\/en\/blog\/bcr-x-arobs-driving-digital-banking-innovation\/\" >\n\t\t\t\tBCR X AROBS: Driving Digital Banking Innovation\t\t\t<\/a>\n\t\t<\/h3>\n\t\t\n\t\t<a class=\"elementor-post__read-more\" href=\"https:\/\/arobs.com\/en\/blog\/bcr-x-arobs-driving-digital-banking-innovation\/\" aria-label=\"Read more about BCR X AROBS: Driving Digital Banking Innovation\" tabindex=\"-1\" >\n\t\t\tRead More \u00bb\t\t<\/a>\n\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-post__meta-data\">\n\t\t\t\t\t<span class=\"elementor-post-author\">\n\t\t\tDiana-Maria Coste\t\t<\/span>\n\t\t\t\t<span class=\"elementor-post-date\">\n\t\t\tAugust 6, 2026\t\t<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/article>\n\t\t\t\t<article class=\"elementor-post elementor-grid-item post-23882 post type-post status-publish format-standard has-post-thumbnail hentry category-case-study category-case-study-es\" role=\"listitem\">\n\t\t\t<div class=\"elementor-post__card\">\n\t\t\t\t<a class=\"elementor-post__thumbnail__link\" href=\"https:\/\/arobs.com\/en\/blog\/10-years-of-partnership-how-arobs-helped-modernise-vitrado-the-affiliate-e-commerce-platform-part-of-the-german-freenet-group\/\" tabindex=\"-1\" ><div class=\"elementor-post__thumbnail\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"283\" src=\"https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/vitrado-ecommerce1-1024x283.png\" class=\"attachment-large size-large wp-image-24657\" alt=\"\" srcset=\"https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/vitrado-ecommerce1-1024x283.png 1024w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/vitrado-ecommerce1-300x83.png 300w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/vitrado-ecommerce1-768x212.png 768w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/vitrado-ecommerce1-1536x424.png 1536w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/vitrado-ecommerce1-720x199.png 720w, https:\/\/arobs.com\/wp-content\/uploads\/2026\/08\/vitrado-ecommerce1.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/a>\n\t\t\t\t<div class=\"elementor-post__badge\">Case study<\/div>\n\t\t\t\t<div class=\"elementor-post__avatar\">\n\t\t\t<img alt='camelia.oltean' src='https:\/\/secure.gravatar.com\/avatar\/dfc8d5d588b3ce8f181a97e05ffb183b1a161649e958cbfbdf9019b874129cbe?s=128&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/dfc8d5d588b3ce8f181a97e05ffb183b1a161649e958cbfbdf9019b874129cbe?s=256&#038;d=mm&#038;r=g 2x' class='avatar avatar-128 photo' height='128' width='128' \/>\t\t<\/div>\n\t\t\t\t<div class=\"elementor-post__text\">\n\t\t\t\t<h3 class=\"elementor-post__title\">\n\t\t\t<a href=\"https:\/\/arobs.com\/en\/blog\/10-years-of-partnership-how-arobs-helped-modernise-vitrado-the-affiliate-e-commerce-platform-part-of-the-german-freenet-group\/\" >\n\t\t\t\t10+ Years of Partnership: How AROBS Helped Modernise vitrado, the Affiliate &#038; E-Commerce Platform, part of the German Freenet Group\t\t\t<\/a>\n\t\t<\/h3>\n\t\t\n\t\t<a class=\"elementor-post__read-more\" href=\"https:\/\/arobs.com\/en\/blog\/10-years-of-partnership-how-arobs-helped-modernise-vitrado-the-affiliate-e-commerce-platform-part-of-the-german-freenet-group\/\" aria-label=\"Read more about 10+ Years of Partnership: How AROBS Helped Modernise vitrado, the Affiliate &#038; E-Commerce Platform, part of the German Freenet Group\" tabindex=\"-1\" >\n\t\t\tRead More \u00bb\t\t<\/a>\n\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-post__meta-data\">\n\t\t\t\t\t<span class=\"elementor-post-author\">\n\t\t\tcamelia.oltean\t\t<\/span>\n\t\t\t\t<span class=\"elementor-post-date\">\n\t\t\tJuly 2, 2026\t\t<\/span>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/article>\n\t\t\t\t<\/div>\n\t\t\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6ed4ece4 ot-traditional elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6ed4ece4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e58133 ot-flex-column-vertical\" data-id=\"3e58133\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2a5b396e elementor-widget elementor-widget-spacer\" data-id=\"2a5b396e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-35739d14 elementor-widget elementor-widget-heading\" data-id=\"35739d14\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Follow us on social media!<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-768a56b4 elementor-widget elementor-widget-spacer\" data-id=\"768a56b4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-776e1ef5 elementor-shape-rounded elementor-grid-0 e-grid-align-center elementor-widget elementor-widget-social-icons\" data-id=\"776e1ef5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"social-icons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-social-icons-wrapper elementor-grid\" role=\"list\">\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-facebook elementor-repeater-item-d50f470\" href=\"https:\/\/www.facebook.com\/AROBS\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Facebook<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-facebook\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-linkedin elementor-repeater-item-8a4a78a\" href=\"https:\/\/www.linkedin.com\/company\/arobs\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Linkedin<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-linkedin\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-instagram elementor-repeater-item-d6d4706\" href=\"https:\/\/www.instagram.com\/arobs_transilvania\/\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Instagram<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-instagram\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-twitter elementor-repeater-item-84bfe0b\" href=\"https:\/\/twitter.com\/AROBSSoftware\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Twitter<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-twitter\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t\t\t<span class=\"elementor-grid-item\" role=\"listitem\">\n\t\t\t\t\t<a class=\"elementor-icon elementor-social-icon elementor-social-icon-youtube elementor-repeater-item-3dad44d\" href=\"https:\/\/www.youtube.com\/channel\/UCwj21vmXJoxhfiYmdKod9OA\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-screen-only\">Youtube<\/span>\n\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-youtube\"><\/i>\t\t\t\t\t<\/a>\n\t\t\t\t<\/span>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Find out more about how Reactive extensions can make your programming life easier. Read the in-depth introduction in the world of Rx.<\/p>\n","protected":false},"author":13,"featured_media":17879,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_angie_page":false,"page_builder":"","footnotes":""},"categories":[33],"tags":[],"class_list":["post-8070","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.1 (Yoast SEO v28.1) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Reactive extensions (Rx) - AROBS Transilvania Software development<\/title>\n<meta name=\"description\" content=\"Reactive extensions can make your programming life easier. But how does it work? Read the in-depth introduction in the world of Rx.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reactive extensions (Rx)\" \/>\n<meta property=\"og:description\" content=\"Find out more about how Reactive extensions can make your programming life easier. Read the in-depth introduction in the world of Rx.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/\" \/>\n<meta property=\"og:site_name\" content=\"AROBS Transilvania Software development\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/AROBS\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-02T08:13:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-01-07T09:08:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/arobs.com\/wp-content\/uploads\/2019\/12\/AROBS_Rx_art_1920x530px.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"530\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Lucian Costea\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@AROBSSoftware\" \/>\n<meta name=\"twitter:site\" content=\"@AROBSSoftware\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lucian Costea\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/\"},\"author\":{\"name\":\"Lucian Costea\",\"@id\":\"https:\\\/\\\/arobs.com\\\/#\\\/schema\\\/person\\\/c1e3a128cca38abfc7113d5630065a11\"},\"headline\":\"Reactive extensions (Rx)\",\"datePublished\":\"2019-12-02T08:13:19+00:00\",\"dateModified\":\"2022-01-07T09:08:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/\"},\"wordCount\":1765,\"publisher\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/arobs.com\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/AROBS_Rx_art_1920x530px.jpg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/\",\"url\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/\",\"name\":\"Reactive extensions (Rx) - AROBS Transilvania Software development\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/arobs.com\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/AROBS_Rx_art_1920x530px.jpg\",\"datePublished\":\"2019-12-02T08:13:19+00:00\",\"dateModified\":\"2022-01-07T09:08:11+00:00\",\"description\":\"Reactive extensions can make your programming life easier. But how does it work? Read the in-depth introduction in the world of Rx.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/arobs.com\\\/blog\\\/reactive-extensions-rx\\\/#primaryimage\",\"url\":\"https:\\\/\\\/arobs.com\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/AROBS_Rx_art_1920x530px.jpg\",\"contentUrl\":\"https:\\\/\\\/arobs.com\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/AROBS_Rx_art_1920x530px.jpg\",\"width\":1920,\"height\":530,\"caption\":\"Reactive extensions\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/arobs.com\\\/#website\",\"url\":\"https:\\\/\\\/arobs.com\\\/\",\"name\":\"AROBS Transilvania Software development\",\"description\":\"IT solutions of top quality\",\"publisher\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/arobs.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/arobs.com\\\/#organization\",\"name\":\"Software Development - AROBS Transilvania Software\",\"url\":\"https:\\\/\\\/arobs.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/arobs.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/arobs.com\\\/wp-content\\\/uploads\\\/2021\\\/06\\\/arobs-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/arobs.com\\\/wp-content\\\/uploads\\\/2021\\\/06\\\/arobs-logo.jpg\",\"width\":763,\"height\":747,\"caption\":\"Software Development - AROBS Transilvania Software\"},\"image\":{\"@id\":\"https:\\\/\\\/arobs.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/AROBS\",\"https:\\\/\\\/x.com\\\/AROBSSoftware\",\"https:\\\/\\\/www.instagram.com\\\/arobs_transilvania\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/arobs\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCwj21vmXJoxhfiYmdKod9OA\",\"https:\\\/\\\/ro.wikipedia.org\\\/wiki\\\/Arobs_Transilvania_Software\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/arobs.com\\\/#\\\/schema\\\/person\\\/c1e3a128cca38abfc7113d5630065a11\",\"name\":\"Lucian Costea\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/305d3f8f2c7615cadf8cb8980c3c7fbd38abae8b8f5c9417875ed1e4921c4404?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/305d3f8f2c7615cadf8cb8980c3c7fbd38abae8b8f5c9417875ed1e4921c4404?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/305d3f8f2c7615cadf8cb8980c3c7fbd38abae8b8f5c9417875ed1e4921c4404?s=96&d=mm&r=g\",\"caption\":\"Lucian Costea\"},\"url\":\"https:\\\/\\\/arobs.com\\\/en\\\/blog\\\/author\\\/lucian-costea\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Reactive extensions (Rx) - AROBS Transilvania Software development","description":"Reactive extensions can make your programming life easier. But how does it work? Read the in-depth introduction in the world of Rx.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/","og_locale":"en_US","og_type":"article","og_title":"Reactive extensions (Rx)","og_description":"Find out more about how Reactive extensions can make your programming life easier. Read the in-depth introduction in the world of Rx.","og_url":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/","og_site_name":"AROBS Transilvania Software development","article_publisher":"https:\/\/www.facebook.com\/AROBS","article_published_time":"2019-12-02T08:13:19+00:00","article_modified_time":"2022-01-07T09:08:11+00:00","og_image":[{"width":1920,"height":530,"url":"https:\/\/arobs.com\/wp-content\/uploads\/2019\/12\/AROBS_Rx_art_1920x530px.jpg","type":"image\/jpeg"}],"author":"Lucian Costea","twitter_card":"summary_large_image","twitter_creator":"@AROBSSoftware","twitter_site":"@AROBSSoftware","twitter_misc":{"Written by":"Lucian Costea","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/#article","isPartOf":{"@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/"},"author":{"name":"Lucian Costea","@id":"https:\/\/arobs.com\/#\/schema\/person\/c1e3a128cca38abfc7113d5630065a11"},"headline":"Reactive extensions (Rx)","datePublished":"2019-12-02T08:13:19+00:00","dateModified":"2022-01-07T09:08:11+00:00","mainEntityOfPage":{"@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/"},"wordCount":1765,"publisher":{"@id":"https:\/\/arobs.com\/#organization"},"image":{"@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/#primaryimage"},"thumbnailUrl":"https:\/\/arobs.com\/wp-content\/uploads\/2019\/12\/AROBS_Rx_art_1920x530px.jpg","articleSection":["Blog"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/","url":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/","name":"Reactive extensions (Rx) - AROBS Transilvania Software development","isPartOf":{"@id":"https:\/\/arobs.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/#primaryimage"},"image":{"@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/#primaryimage"},"thumbnailUrl":"https:\/\/arobs.com\/wp-content\/uploads\/2019\/12\/AROBS_Rx_art_1920x530px.jpg","datePublished":"2019-12-02T08:13:19+00:00","dateModified":"2022-01-07T09:08:11+00:00","description":"Reactive extensions can make your programming life easier. But how does it work? Read the in-depth introduction in the world of Rx.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/arobs.com\/blog\/reactive-extensions-rx\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arobs.com\/blog\/reactive-extensions-rx\/#primaryimage","url":"https:\/\/arobs.com\/wp-content\/uploads\/2019\/12\/AROBS_Rx_art_1920x530px.jpg","contentUrl":"https:\/\/arobs.com\/wp-content\/uploads\/2019\/12\/AROBS_Rx_art_1920x530px.jpg","width":1920,"height":530,"caption":"Reactive extensions"},{"@type":"WebSite","@id":"https:\/\/arobs.com\/#website","url":"https:\/\/arobs.com\/","name":"AROBS Transilvania Software development","description":"IT solutions of top quality","publisher":{"@id":"https:\/\/arobs.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/arobs.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/arobs.com\/#organization","name":"Software Development - AROBS Transilvania Software","url":"https:\/\/arobs.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arobs.com\/#\/schema\/logo\/image\/","url":"https:\/\/arobs.com\/wp-content\/uploads\/2021\/06\/arobs-logo.jpg","contentUrl":"https:\/\/arobs.com\/wp-content\/uploads\/2021\/06\/arobs-logo.jpg","width":763,"height":747,"caption":"Software Development - AROBS Transilvania Software"},"image":{"@id":"https:\/\/arobs.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/AROBS","https:\/\/x.com\/AROBSSoftware","https:\/\/www.instagram.com\/arobs_transilvania\/","https:\/\/www.linkedin.com\/company\/arobs","https:\/\/www.youtube.com\/channel\/UCwj21vmXJoxhfiYmdKod9OA","https:\/\/ro.wikipedia.org\/wiki\/Arobs_Transilvania_Software"]},{"@type":"Person","@id":"https:\/\/arobs.com\/#\/schema\/person\/c1e3a128cca38abfc7113d5630065a11","name":"Lucian Costea","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/305d3f8f2c7615cadf8cb8980c3c7fbd38abae8b8f5c9417875ed1e4921c4404?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/305d3f8f2c7615cadf8cb8980c3c7fbd38abae8b8f5c9417875ed1e4921c4404?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/305d3f8f2c7615cadf8cb8980c3c7fbd38abae8b8f5c9417875ed1e4921c4404?s=96&d=mm&r=g","caption":"Lucian Costea"},"url":"https:\/\/arobs.com\/en\/blog\/author\/lucian-costea\/"}]}},"_links":{"self":[{"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/posts\/8070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/comments?post=8070"}],"version-history":[{"count":0,"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/posts\/8070\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/media\/17879"}],"wp:attachment":[{"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/media?parent=8070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/categories?post=8070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arobs.com\/en\/wp-json\/wp\/v2\/tags?post=8070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}