{"id":1814,"date":"2023-11-28T05:00:00","date_gmt":"2023-11-28T13:00:00","guid":{"rendered":"https:\/\/www.angulartraining.com\/daily-newsletter\/?p=1814"},"modified":"2023-11-28T16:56:03","modified_gmt":"2023-11-29T00:56:03","slug":"sharereplay-code-challenge-1-solution","status":"publish","type":"post","link":"https:\/\/www.angulartraining.com\/daily-newsletter\/sharereplay-code-challenge-1-solution\/","title":{"rendered":"ShareReplay Code Challenge #1 Solution"},"content":{"rendered":"\n<p>What was wrong with yesterday&#8217;s <a href=\"https:\/\/www.angulartraining.com\/daily-newsletter\/code-challenge-1-sharereplay\/\" target=\"_blank\" rel=\"noopener\" title=\"\">code example<\/a>? Here it is as a reminder:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"664\" src=\"http:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-34.png\" alt=\"\" class=\"wp-image-1812\" style=\"width:475px;height:auto\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-34.png 840w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-34-300x237.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-34-768x607.png 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Since the developer used the <code><a href=\"https:\/\/www.angulartraining.com\/daily-newsletter\/rxjs-share-and-sharereplay-operators\/\" target=\"_blank\" rel=\"noopener\" title=\"\">shareReplay<\/a><\/code> operator, the intent was to cache the result of the HTTP request so that we do not make that request repeatedly. <\/p>\n\n\n\n<p>The problem is that if several components call the <code>getData()<\/code> method, they all get a brand new Observable since the method returns a new request every time, which defeats the purpose of using <code>shareReplay<\/code>.<\/p>\n\n\n\n<p>How can we fix this? By creating the Observable once then sharing the results in subsequent calls to <code>getData():<\/code><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"887\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-35-1024x887.png\" alt=\"\" class=\"wp-image-1816\" style=\"width:514px;height:auto\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-35-1024x887.png 1024w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-35-300x260.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-35-768x665.png 768w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-35.png 1076w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Here&#8217;s another way to do it, perhaps even more readable:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"676\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-36-1024x676.png\" alt=\"\" class=\"wp-image-1817\" style=\"width:555px;height:auto\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-36-1024x676.png 1024w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-36-300x198.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-36-768x507.png 768w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/11\/image-36.png 1076w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>Why do these solutions work? <a href=\"https:\/\/www.angulartraining.com\/daily-newsletter\/using-services-to-cache-data\/\" target=\"_blank\" rel=\"noopener\" title=\"\"><code>DataService<\/code> is a singleton<\/a>, which means all components use the same instance of <code>DataService<\/code>. As a result, any property of <code>DataService<\/code> (such as <code>cache$<\/code>) is the same for all components that access it.<\/p>\n\n\n\n<p>Another critical thing to note is that HTTP requests are <a href=\"https:\/\/www.angulartraining.com\/daily-newsletter\/hot-and-cold-rxjs-observables\/\" target=\"_blank\" rel=\"noopener\" title=\"\">cold observables<\/a>, which means they only fire when a subscriber subscribes to them.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>What was wrong with yesterday&#8217;s code example? Here it is as a reminder: Since the developer used the shareReplay operator, the intent was to cache the result of the HTTP request so that we do not make that request repeatedly. The problem is that if several components call the getData() method, they all get a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,40,12,10],"tags":[],"class_list":["post-1814","post","type-post","status-publish","format-standard","hentry","category-angular","category-code-challenge","category-operators","category-rxjs"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1814","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/comments?post=1814"}],"version-history":[{"count":4,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1814\/revisions"}],"predecessor-version":[{"id":1828,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1814\/revisions\/1828"}],"wp:attachment":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/media?parent=1814"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/categories?post=1814"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/tags?post=1814"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}