داستان کوتاه: Promise

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

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

فرزند بعد از چند ساعت به خانه باز میگشت. هر هفته نتایج وضعیت آب و هوا متفاوت بود:


وضعیت آب و هوا خوب و آفتابی است


فرزند موفق می شود وضعیت آب و هوا را پیش‌بینی کند: آسمانی صاف و آفتابی است! قول (promise) انجام شد (فرزند به وعده خود عمل کرد) و پدر تصمیم می گیرد که بسات شکار گوزن را برای جمعه آماده کند.


وضعیت آب و هوا مه آلود و کولاک است


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


وضعیت آب و هوا قابل پیش‌بینی نیست


قرزند قادر به پیش‌بینی آب و هوا نشد، مشکلی وجود دارد. هوا مه آلود بود و مانع دید آب و هوای آن سوی قله‌ها می شد. پسر بخاطر وضعیت نا مناسب آب و هوا شب را در کلبه بین راهی سپری می کند  قولی که فرزند به پدرش داد شکسته شد – promise رد شد! پدر تصمیم می گیرد بماند و ریسک این خطر را نکند.


Promise در کُد نیز به همین صورت است.


پدر کنترل منطق این وضعیت را در اختیار داشت، و او با فرزندش عهد به عنوان یک سرویس عهد کرده بود. ما به وضوح منطق را مشخص کرده ایم. پدر از پسر وضعیت آب و هوا را می پرسد و پسر نمی تواند فورا به او پاسخ دهد، و پدر کارهای دیگری دارد که باید انجام دهد در حالی که منتظر جواب پسر است که قول داده با وضعیت آب و هوا برگردد. وقتی پدر وضعیت آب و هوا را داشته باشد، می تواند تصمیم گیرد که آیا تفنگ دولول خودش را برای فردا صبح آماده کند یا اینکه در خانه بماند. نکته مهم در اینجا این است که سفر پسر به سوی تپه ها نباید باعث عدم انجام کارهای پدر شود، بنابراین این موقعیت خوبی است که یک promise ایجاد کنیم، که می تواند (fulfilled or rejected) بعد از آن را حل و فصل کند. با استفاده از تابع ()then می توانیم مشخص کنیم پدر در هر نتیجه به چه چیزی برای انجام دادن نیاز دارد. تابع ()then دو تابع را به عنوان پارامتر قبول می کند – یک تابع برای اینکه وعده برآورده شده است و یک تابع برای وقتی که وعده رد شده است.


از فرزند به عنوان یک سرویس استفاده می شود، او به بالای قله رفت و سعی کرد تا آب و هوا را مشاهده کند. ما فرض می کنیم که فرزند با استفاده از دوربین آب و هوا را پیش‌بینی میکند، این شبیه به استفاده از API آب و هوا است، به این معنا که یک عملیات asynchronous است، او ممکن است پاسخ های متغیر داشته باشد، یا دارای مشکلاتی باشد (مثلا یک پاسخ 500، هوای مه آلود). پاسخ آمده از «API آب و هوای شکار» می تواند با promise بازگشت داده شود، اگر وعده انجام شد با قالب { "forecast": "good" } خواهد بود.