Loading...

микро тапшырмалар

микро тапшырмалар

 

промистерди иштетүүчүлөр .then// ар .catchдайым .finallyасинхрондуу.

промис аткарылганда да, төмөндөгү код / .then ​​/ ушул иштетүүчүлөрдүн алдында иштейт .catch..finally

Бул жерде демо болуп саналат:

@A@let promise = Promise.resolve();

promise.then(() => alert("промис выполнен"));

alert("код выполнен"); // этот alert показывается первым@A@

Аны иштетсеңиз, адегенде көрөсүз, код выполненанан промис выполнен.

Бул таң калыштуу, анткени убада башынан эле сөзсүз аткарылды.

Эмне үчүн .thenкийинчерээк иштейт? Эмне болуп жатат?

Микротапшырма кезеги

Асинхрондук тапшырмалар туура башкарууну талап кылат. Бул үчүн, стандарт ички кезекти камсыз кылат PromiseJobs, жакшыраак "микроташуу кезеги" (V8 термини) катары белгилүү.

Спецификацияда айтылгандай :

  • Кезек биринчи кирген биринчи чыккан (FIFO) катары аныкталат: кезекте биринчи турган тапшырмалар да биринчи аткарылат.
  • Тапшырма башка эч нерсе иштебесе гана аткарылат.

Жөнөкөй сөз менен айтканда, убада аткарылганда, аны иштетүүчүлөр .then/catch/finallyкезекке турушат. Алар азырынча ишке ашырыла элек. JavaScript кыймылдаткычы кезектеги тапшырманы алат жана учурдагы кодду аткаруудан бош болгондо аны аткарат.

Ошондуктан жогорудагы мисалдагы "код аткарылды" билдирүүсү биринчи көрсөтүлөт

Убада берүүчүлөр дайыма ушул ички кезектен өтүшөт.

Эгерде бир нече чынжыр бар болсо .then/catch/finally, анда алардын ар бири асинхрондуу түрдө аткарылат. Башкача айтканда, алгач кезекте турат, андан кийин учурдагы коддун аткарылышы аяктаганда жана кезекке мурда кошулган иштеткичтер аткарылганда аткарылат.

Бирок биз үчүн тартип маанилүү болсочу? код выполненАндан кийин кантип чыга алабыз промис выполнен?

Колдонуу оңой .then:

@A@Promise.resolve()
  .then(() => alert("промис выполнен!"))
  .then(() => alert("код выполнен"));@A@

Азыр тартип кандай болсо, ошондой.

Иштетилбеген каталар

Promises : Error Handling программасынан "башкарылбаган каталар" эсиңиздеби ?

Эми биз JavaScript ката чечилбегендигин кантип түшүнөрүн так сүрөттөп бере алабыз.

Микротапшырма кезегинин аягында убада катасы иштетилбей калганда "иштелбеген ката" пайда болот.

Адатта, эгер ката күтсөк, .catchаны чечүү үчүн убада чынжырынын аягына кошобуз:

@A@let promise = Promise.reject(new Error("Ошибка в промисе!"));
promise.catch(err => alert('поймана!'));

// не запустится, ошибка обработана
window.addEventListener('unhandledrejection', event => {
  alert(event.reason);
});@A@

…Бирок эгер биз кошууну унутуп калсак .catch, анда микротапшырма кезеги бош болгондо, кыймылдаткыч окуяны жаратат:

 
 
@A@let promise = Promise.reject(new Error("Ошибка в промисе!"));

// Ошибка в промисе!
window.addEventListener('unhandledrejection', event => alert(event.reason));@A@

Эгер катаны кийинчерээк байкасакчы? Бул сыяктуу:

@A@let promise = Promise.reject(new Error("Ошибка в промисе!"));

setTimeout(() => promise.catch(err => alert('поймана')), 1000);

// Ошибка в промисе!
window.addEventListener('unhandledrejection', event => alert(event.reason));@A@

Эми, ишке киргизүүдө, биз адегенде "Убададагы ката!", анан "кармалды" көрөбүз.

Эгерде биз микротапшырма кезеги жөнүндө билбесек, анда: "Эмне үчүн иштеткич иштеди unhandledrejection? Биз катаны кармадык!"

Бирок азыр биз микротапшырма кезеги аяктагандан кийин окуя unhandledrejectionөчүрүлөөрүн түшүнөбүз: кыймылдаткыч бардык убадаларды текшерет жана алардын бирөө "четке кагылган" абалда болсо, анда бул окуя өчүрүлөт.

Жогорудагы мисалда отко .catchкошулган setTimeout, бирок кийинчерээк пайда болгондон кийин unhandledrejection, ал эч нерсеге таасирин тийгизбейт.

Бардыгы

Убадаларды иштетүү дайыма асинхрондуу. бардык убада иш-аракеттери "микротапшырмалар кезеги" деп аталган ички "убада жумуштары" кезеги аркылуу өтөт (v8 термини).

Ошентип, иштетүүчүлөр .then/catch/finallyучурдагы код аткарылгандан кийин чакырылат.

Эгер кандайдыр бир коддун аткарылышына кепилдик беришибиз керек болсо .then/catch/finally, анда анын чакырыгына .then.

Көпчүлүк JavaScript кыймылдаткычтарында, анын ичинде браузерлерде жана Node.jsде, микротапшырмалар "окуя цикли" жана "макротапшырмалар" деп аталган нерселер менен тыгыз байланышта. Алар убадаларга түздөн-түз тиешеси жок болгондуктан, алар окуу куралынын башка бөлүгүндө, Окуялардын циклинде: Микроталаптар жана Макроталаптар бөлүмүндө камтылган .