Angular rxResource İçinde tap() Kullanmayı Neden Bıraktım
Angular rxResource stream'i içinde tap() ile signal yazmak NG0600 hatasına yol açar. Doğru çözüm: stream'i tek tip değer döndürecek şekilde tasarlamak.
Angular'ın Signals ekosisteminde rxResource, yükleme ve hata durumlarını otomatik yöneten popüler bir yardımcı haline geldi. Ancak yaygın bir anti-pattern, stream içinde tap() operatörüyle başka bir signal'e doğrudan yazma yapmak. Bu, zone-based Angular'da sessizce çalışsa da zoneless mimariye geçildiğinde veya Angular'ın reaktif graf denetimi sıkılaştırıldığında NG0600 hatasını tetikliyor: reaktif bağlamda signal yazmak yasak.
Sorunun kökü, rxResource stream'inin Angular'ın reaktif zamanlayıcısı içinde çalışması. Bu zamanlayıcı, computed signal'lerin ve reaktif bağlamların değerlendirme sırasında salt-okunur kalacağını varsayar; hesaplama ortasında yapılan bir yazma, signal grafiğinin dayandığı glitch-free garantisini bozar.
Önerilen çözüm, stream'in ihtiyaç duyulan her şeyi tek, tipli bir değer olarak döndürmesi. tap() ile yan etki üretmek yerine map() kullanılarak sections ve meta gibi alanlar tek bir ResourceValue arayüzünde birleştiriliyor; geri kalan kod bu değeri resource.value() üzerinden veya computed ile okuyor.
Buradaki asıl ders tap()'i tamamen terk etmek değil, rxResource'un bir 'okuma primitifi' olduğunu kabul etmek. Stream, veri çekme ve dönüştürme içindir; içine signal yazmak, onu bir komut veri yolu gibi kullanmaya çalışmak anlamına gelir ki bu farklı bir aracın işi.