آموزش ویژگی های ECMAScript 6 (جلسه 38) : آموزش کار با Promise - قسمت 4

- visibility ۰ mode_comment

همونطور که اطلاع دارید در جلسه قبل در مورد Promise ها و نحوه کارکرد اونا توضیحاتی رو قرار دادیم. در این جلسه میخوایم بحث قول ها رو به پایان برسونیم و مباحث تکمیلی رو در اختیارتون قرار بدیم.

همونطور که دیدید در جلسه قبل حالتهای مختلفی برای کار کردن با Promise ها رو بهتون آموزش دادیم. در این جلسه میخوایم موارد بیشتری رو نیز در اختیارتون قرار بدیم. کد زیر رو در نظر بگیرید:

همونطور که میبینید یک قول در متغیر p2 ذخیره کردیم و در اون resolve رو فراخوانی کردیم و عدد 4 رو به اون پاس دادیم. با اینکار متد then از قول مورد نظر صدا زده میشه. در خط 5 متد then رو تعریف کردیم. مقدار val همون عدد 4 که درون resolve قرار داده شده بود، می باشد. در خط 5 مقدار 4 با 4 جمع میشه.

همونطور که میبینید چند متد then رو بصورت زنجیر مانند پشت سر هم استفاده کردیم. در این مواقع، خروجی هر then، ورودی then بعدی خواهد بود. خروجی then در خط 5 همون عدد 8 خواهد بود. در خط 6 از عدد 8، عدد 2 را کم میکنیم و حاصل اون 6 خواهد شد. در نهایت این عدد 6 ورودی متد then در خط 7 می باشد و اون رو در Console چاپ میکنیم. بصورت زیر:

میبینید که عدد 6 در Console قرار گرفته است. به همین راحتی میتونین از متدهای then پشت سر هم استفاده کنید. بعضی از مواقع یک قول، یک قول دیگه رو برگشت میده که میتونین با استفاده از همین روش، اطلاعات مربوط به اون رو بدست بیارید.

سر و کار داشتن با ارورها

شما میتونین با استفاده از متد then ارورها رو نیز تحت پوشش قرار بدین. برای اینکار بصورت .then(null, fn) عمل میکنیم. اما از این کار خودداری کنید و بجای اون از متد Catch استفاده کنید. این متد مخصوص مدیریت ارورها تعبیه شده است و توسعه میشه که از اون استفاده کنید.

شما میتونین بعد از متدهای then که بصورت تکی یا زنجیروار پشت سر هم قرار گرفته اند، یکبار متد catch رو مورد استفاده قرار بدین و با اینکار اگر اروری در خود Promise یا متدهای دیگه رخ بده، متد catch فراخوانی میشه و اون رو مدیریت میکنه.

به دو صورت امکان داره که متد catch فراخوانی بشه. روش اول اینه که تابع reject رو درون قول مورد نظر فراخوانی کنیم. بصورت زیر:

همونطور که میبینید یک قول بنام p1 تعریف کردیم و درون اون تابع reject رو با یک رشته فراخوانی کردیم. با اینکار متد catch صدا زده میشه و متن مورد نظر نیز به اون ارسال میشه. پس خروجی error: rejected! خواهد بود.

روش بعدی اینه که یک ارور درون قول یا یکی از متدهای then رخ بدهد. در این صورت از همه متدهای then صرف نظر میشه و متد catch فراخوانی شده و کدهای درون اون اجرا می شوند. بصورت زیر:

همونطور که میبینید بجای فراخوانی تابع reject، یک ارور رو throw کردیم. با اینکار نیز همانند مثال قبل متد catch صدا زده میشه و متن مورد نظر در Console چاپ میشه.

در کد بالا ارور در قول رخ داده است. این ارور میتونه در یکی از متدهای then نیز رخ بدهد. بصورت زیر:

همونطور که میبینید در خط 6 که دومین then قرار داده شده است، یک ارور throw شده است و با اینکار از متدهای then دیگه صرف نظر شده و متد catch فراخوانی میشه و ارور مورد نظر در Console چاپ میشه. در این مثالها ارورها بصورت دستی ساخته شدند و در مثالهای واقعی این ارورها میتونن به دلایل مختلفی به وجود بیایند.

کار کردن با متدهای all و race

بعضی اوقات پیش میاد که ما با چند قول سر و کار داریم و میخوایم کار خاصی رو با fulfill یا موفق شدن همه اونا انجام بدیم. در این مواقع میتونیم از متد all استفاده کنیم. شما میتونین آرایه ای از قول ها رو به متد all پاس بدین و به محض اینکه همه اونا موفق شدند، آرایه ای از مقادیر اونا برگشت داده میشه. بصورت زیر:

میبینید که 3 قول رو تعریف کردیم و به ترتیب بعد از 1 و 2 و 3 ثانیه تابع resolve در اونا فراخوانی میشه. در خط 19 از متد all استفاده کردیم و سه قول رو بصورت یک آرایه به این متد پاس دادیم. با اینکار بعد از اینکه سه قول fulfilled شدن و متد resolve در اونا فراخوانی شد (بعد از 3 ثانیه) متد then فراخوانی میشه و آرایه ای از مقادیر برگشتی در Console چاپ میشه:

همچنین بعضی اوقات نیازی نداریم که منتظر همه قول ها بمونیم و میخوایم به محض اینکه اولین قول fulfilled شد، مقدار اون در Console چاپ بشه. برای اینکار از متد race استفاده میکنیم. بصورت زیر:

میبینید که از همون کدهای قبل استفاده کردیم با این تفاوت که بجای متد all، متد race رو قرار دادیم. چون قول p1 سریعتر از همه و در 1 ثانیه resolve میشه، پس رشته مربوط به قول اول در Console چاپ میشه. بصورت زیر:

میبینید که استفاده از Promise ها چقد آسان و لذت بخش می باشد و کار کردن با کدهای Asynchronous رو راحتتر کرده است. در نسخه های بعدی Ecmascript کلمات کلیدی async و await معرفی شده اند که با استفاده از اونا خیلی راحت تر میتونین با قول ها و برنامه نویسی غیرهمزمان کار کنید که در آینده نزدیک آموزش اونا رو نیز در اختیارتون قرار میدیم.

برای مطالعه بیشتر در زمینه قول ها میتونین لینکهای زیر رو مطالعه کنید:

موفق و پیروز باشید.

یا علی

comment دیدگاه کاربران

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.