{"id":1054,"date":"2023-06-09T05:00:00","date_gmt":"2023-06-09T12:00:00","guid":{"rendered":"https:\/\/www.angulartraining.com\/daily-newsletter\/?p=1054"},"modified":"2025-01-13T14:35:58","modified_gmt":"2025-01-13T22:35:58","slug":"rxjs-and-signals-interoperability","status":"publish","type":"post","link":"https:\/\/www.angulartraining.com\/daily-newsletter\/rxjs-and-signals-interoperability\/","title":{"rendered":"RxJs and Signals interoperability"},"content":{"rendered":"\n<p><a href=\"https:\/\/www.angulartraining.com\/daily-newsletter\/angular-16-is-now-available\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Angular 16<\/a> introduced several features related to the brand-new <a href=\"https:\/\/www.angulartraining.com\/daily-newsletter\/category\/angular\/signals\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Angular Signals<\/a>, which include two functions enabling RxJs interoperability.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/angular.io\/api\/core\/rxjs-interop\/toObservable\" target=\"_blank\" rel=\"noopener\" title=\"\">toObservable()<\/a><\/h2>\n\n\n\n<p>The name says it all. <code>toObservable()<\/code> takes a Signal and returns its data as an Observable:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"872\" height=\"112\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-4.png\" alt=\"\" class=\"wp-image-1055\" style=\"width:569px;height:72px\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-4.png 872w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-4-300x39.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-4-768x99.png 768w\" sizes=\"auto, (max-width: 872px) 100vw, 872px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>This new Observable gets updated every time the underlying Signal value is updated. We can subscribe to it using the async pipe, for instance (<a href=\"https:\/\/stackblitz.com\/edit\/at-effect-jz49nr?file=src%2Fmain.ts\" target=\"_blank\" rel=\"noopener\" title=\"\">demo code here<\/a>):<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"688\" height=\"60\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-5.png\" alt=\"\" class=\"wp-image-1056\" style=\"width:504px;height:44px\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-5.png 688w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-5-300x26.png 300w\" sizes=\"auto, (max-width: 688px) 100vw, 688px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/angular.io\/api\/core\/rxjs-interop\/toSignal\" target=\"_blank\" rel=\"noopener\" title=\"\">toSignal()<\/a><\/h2>\n\n\n\n<p><code>toSignal() <\/code>does the opposite of <code>toObservable()<\/code>. It turns an Observable into a Signal. Since Signals are different from Observables (a Signal always has a value right from the start &#8211; an Observable does not), the default behavior of <code>toSignal()<\/code> is to return a Signal that supports <code>undefined<\/code> as a default value:<\/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=\"66\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-6-1024x66.png\" alt=\"\" class=\"wp-image-1058\" style=\"width:713px;height:46px\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-6-1024x66.png 1024w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-6-300x19.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-6-768x49.png 768w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-6.png 1402w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<p>This can be changed by providing an initial value as follows:<\/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=\"49\" src=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-7-1024x49.png\" alt=\"\" class=\"wp-image-1059\" style=\"width:739px;height:36px\" srcset=\"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-7-1024x49.png 1024w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-7-300x14.png 300w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-7-768x36.png 768w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-7-1536x73.png 1536w, https:\/\/www.angulartraining.com\/daily-newsletter\/wp-content\/uploads\/2023\/06\/image-7.png 1558w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Angular 16 introduced several features related to the brand-new Angular Signals, which include two functions enabling RxJs interoperability. toObservable() The name says it all. toObservable() takes a Signal and returns its data as an Observable: This new Observable gets updated every time the underlying Signal value is updated. We can subscribe to it using the [&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,10,29],"tags":[],"class_list":["post-1054","post","type-post","status-publish","format-standard","hentry","category-angular","category-rxjs","category-signals"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1054","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=1054"}],"version-history":[{"count":3,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1054\/revisions"}],"predecessor-version":[{"id":2254,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/posts\/1054\/revisions\/2254"}],"wp:attachment":[{"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/media?parent=1054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/categories?post=1054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.angulartraining.com\/daily-newsletter\/wp-json\/wp\/v2\/tags?post=1054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}