Node.js кантип иштейт: окуялар цикли жана бөгөттөбөгөн киргизүү-чыгаруу
Асинхрондуулук, таймерлер жана агымдар эмне үчүн так ушундай иштээрин түшүндүргөн бирдиктүү аткаруу модели
- жалгыз негизги агымда эмне аткарылып, эмне аткарылбасын түшүндүрүү;
- чакыруу стеги, окуялар цикли жана анын кезектери кантип биргелешип иштээрин байкоо;
- окуялар циклинин фазаларын жана ар бири эмнени иштетээрин атоо;
setTimeout,setImmediate,Promiseжанаprocess.nextTickтартибин болжолдоо;- бөгөттөгөн кодду таануу жана ал эмне үчүн бүт серверди тоңдуруп салаарын түшүнүү.
Бир агым, бир чакыруу стеги
Node сиздин JavaScript'ти жалгыз чакыруу стеги менен бир агымда аткарат. Чакыруу стеги -- азыр аткарылып жаткан функциялардын тизмеси: функцияны чакырганда ал үстүнө коюлат, кайтканда алынат. Ар бир учурда стектин үстүндөгү функция гана аткарылат.
Стек так бирөө болгондуктан, сиздин JavaScript'тин эки сабы эч качан бир эле учурда аткарылбайт. Кыймылдаткыч (V8) иштин бир бөлүгүн алат, аны аягына чейин аткарат, анан кийинкисин алат. Ошондуктан сиз эч качан башка агым тарабынан жарым-жартылай өзгөртүлгөн өзгөрмөнү көрбөйсүз: JavaScript коду аягына чейин аткарылат. Функцияны ортосунан башка коллбэк үзбөйт; ал башка коллбэк стек кайра бошогонго чейин күтүшү керек.
Бул бир агымдуу модель -- ушул сабактагы бардык нерсенин алдын ала шарты. Бир сүйлөмдү эстеп калсаңыз, ушул болсун: коллбэк чакыруу стеги бош болгондо гана башталат. Окуялар циклинин бүт иши -- ошол бош стекке кийинки кайсы коллбэк жиберилээрин чечүү.
Салыштыруу. Ашканада бир ашпозчуну (агым) элестетиңиз. Ашпозчу бир учурда бир гана иш кыла алат. Бирок акылдуу ашпозчу торт бышып жатканда мешти карап тура бербейт -- ал таймер коет, жашылчаларды туурай баштайт жана таймер зыңгыраганда торткого кайтат. Меш, таймер жана жеткирүүчү -- ашпозчунун сыртындагы жардамчылар. Окуялар цикли -- ашпозчунун кийинки милдетти баштоодон мурун ар дайым "азыр мага эмне даяр?" деп текшерүү адаты.