XState v6 و Effect: مدیریت کارهای async با ماشین حالت
خلاصهٔ کاملتر
تیم XState یه پکیج آزمایشی منتشر کرده که XState v6 رو با Effect 4 ترکیب میکنه. تو مستندات اومده که تقسیم کار بین این دو تا روشنه: XState مدل میکنه که یه فرایند با هر رویداد به چه حالتی میره، و Effect (یه کتابخونهٔ TypeScript برای نوشتن کارهای async همراه با مدیریت خطا و وابستگیها) خودِ کار رو اجرا میکنه. هر دو هنوز آلفا و RC هستن، پس APIها ممکنه تا نسخهٔ پایدار عوض بشن.
مثالی که مستندات میزنه یه فرایند تایید انتشاره. سیستم تا ۳۰ ثانیه منتظر تایید میمونه، رویداد APPROVE فقط از حالت awaitingApproval دیپلوی رو شروع میکنه، و تا وقتی منتظره یا داره دیپلوی میکنه میشه کنسلش کرد. اگه دیپلوی به مشکل بخوره، حالت failed رویداد RETRY رو قبول میکنه؛ ولی حالتهای تمامشده و کنسلشده نهاییان و دیگه هیچ رویدادی نمیگیرن. همین باعث میشه قوانین فرایند تو خود کد دیده بشن.
تایمر انتظار با after کار میکنه و ساعتش همون Clock خود Effectه، نه یه setTimeout ساده. یعنی میتونی همون ماشین رو با TestClock تست کنی و لازم نباشه تو تست واقعاً ۳۰ ثانیه صبر کنی. نکتهٔ دوم اینه که وقتی از حالت deploying بیرون میری، Effectی که داخلش صدا زده شده هم interrupt میشه و سرویس میتونه منابع محلیش رو آزاد کنه.
یه هشدار مهم هم تو مستندات هست: قطع شدن Effect دیپلوی، دیپلویی که یه API بیرونی قبلاً قبولش کرده رو برنمیگردونه. اگه اون API لغو یا rollback داره، باید خودت اون عملیات رو صریح مدل کنی. نکتهٔ عملی دیگه هم اینه که این منطق رو باید با createEffectActor و داخل یه scope از Effect استارت بزنی؛ با createActor خود XState، اکتور مستقیم میره وضعیت error چون هاست Effect وجود نداره.
پشت صحنه یه fiber از Effect صندوق پیام اکتور رو به ترتیب پردازش میکنه، اکشنهای Effect بدون بلاک کردن این صندوق اجرا میشن، و اکتورهای فرزند از همون هاست و همون سرویسها استفاده میکنن. چون پردازش رویدادها asyncه، برای خوندن نتیجهٔ یه send باید از waitFor، join یا snapshots استفاده کنی.
نکات کلیدی:
- XState v6 آلفاست و این پکیج Effect 4 RC رو هدف میگیره؛ خودش هم آزمایشیه.
- استارت باید با createEffectActor باشه؛ createActor اکتور Effectمحور رو میبره به وضعیت error.
- تایمرهای after از Clock خود Effect استفاده میکنن، پس با TestClock قابل تستن.
- خروج از یه حالت، Effectی که تو اون حالت صدا زده شده رو interrupt میکنه.
- interrupt شدن Effect کاری که یه API بیرونی قبلاً انجام داده رو برنمیگردونه.




