وضعیت در $mol مانند یک صفحهگسترده رفتار میکند: شما اعلام میکنید که یک مقدار چگونه محاسبه میشود و هرچه به آن وابسته است خودبهخود بهروز میشود. نه استوری، نه dispatch، نه هوکِ افکت — گراف وابستگیها ردیابی میکند که چه چیزی باید بازمحاسبه شود.
متدی که با @ $mol_mem تزئین شده یک سلولِ واکنشگرای کششده است. یکبار اجرا میشود، نتیجهاش را بهخاطر میسپارد و فقط زمانی بازمحاسبه میکند که چیزی که خوانده تغییر کرده باشد.1namespace $.$${2export class $my_counterextends$.$my_counter{3@ $mol_memcount(){return 0}45@ $mol_memdoubled(){6return this.count()*27}8}9}doubled مقدار count را میخواند، پس بهطور خودکار مشترکِ count میشود. count را تغییر دهید و هر نمایی که doubled را نشان میدهد تازه میشود — چیزی برای اشتراک دستی وجود ندارد.
یک ویژگی همزمان getter و setter است: بدون آرگومان صدایش بزنید تا بخوانید، با یک آرگومان تا بنویسید.1@ $mol_action2increment(){3this.count(this.count()+1)4}
همین یک تمایز کدِ واکنشگرا را قابلپیشبینی نگه میدارد:@ $mol_mem یک محاسبهٔ خالص است — فقط سلولهای دیگر را میخواند و یک مقدار برمیگرداند.@ $mol_action یک افکت است — نوشتن در وضعیت، فراخوانیهای شبکه و تایمرها به اینجا تعلق دارند.نوشتن در یک سلول از درونِ یک @ $mol_mem یک حلقهٔ بازخورد ایجاد میکند (نوشتن یک وابستگی را بیاعتبار میکند، که بازمحاسبه میشود، که دوباره مینویسد). $mol این را بهعنوان اشتراک حلقوی گزارش میدهد. راهحل همیشه یکی است: اثرات جانبی را در کنشها نگه دارید و محاسبهها را خالص نگه دارید.در @ $mol_mem میتوانیداما نههندلرهای دکمه بهصورت @ $mol_mem روی کلاس پایه تولید میشوند؛ آنها را با @ $mol_action بازنویسی کنید تا بتوانند با ایمنی بنویسند:1@ $mol_action2submit(){3this.saved(true)4}