بهنام عظیمی
بهنام عظیمی
خواندن ۴ دقیقه·۵ سال پیش

انجام عملیات مشترک بر روی سرویس ها - Javascript Service Wrapper

سلام دوستان؛

فرض کنید توی پروژتون نیاز دارید که با بک-اند در شرایط و تحت وب سرویس های مختلف ارتباط برقرار کنید. با فرض اینکه تعداد وب سرویس ها 20 باشه، شما باید حداقل 20 متد سرویس داشته باشید که در موقع نیاز اون رو فراخوانی کنید.

در یک ارتباط نرمال، شما باید نتیجه ای که وب سرویس بهتون برگشت میده رو کنترل کنید، باید به خطاهایی احتمالی عکس العمل منطقی نشون بدید، شاید نیاز باشه پارامتر های احراز هویت رو در هر درخواست بروزرسانی کنید و خیلی مورد دیگه. این موارد اکثرا بین درخواست ها مشترک هست. حالا فکر کنید که همه ی این کارا رو باید روی تک-تک اون 20 تا متد انجام بدید (که خیلی هامون انجام میدیم). ولی اگه یه راه آسون تر برای این کار وجود داشته باشه چی؟

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

در توضیح تخصصی تر، شما نیاز به یک کلاس یا متد پوششی دارید که همه ی عملیات مربوط به سرویستون داخل اون انجام بشه و شما بتونید در هر جایی که نیاز داشتید درش دست ببرید و باب نیازتون تغییرش بدید.


این ساختار نه تنها توی برنامه نویسی فرانت اند بلکه در هر محیط توسعه ای که قراره یک سری کار مشترک بر روی یک سرویس انجام بشه، می تونه به کار برنامه نویس بیاد و معمولا برنامه نویس ها بسته به نیازشون یک متد wrapper می نویسن و در پروژه هاشون ازش استفاده می کنن.

برای جاوا اسکریپت آمادش هست

برای جاوا اسکریپت یک ابزاری با اسم JS Service Wrapper آماده کردم. تا نیازی که داریم رو پوشش بده. این ابزار بر پایه Promise هست و حتی یک ساختار صف هم براش در نظر گرفتم برای مواقعی که لازم میشه سرویس هامون در یک صف و به نوبت اجرا بشن. همچنین فرقی نمیکنه که محیط توسعه تون مرورگر باشه یا NodeJS این ابزار در هر دو جواب میده.

یک مثال کامل از کد:

https://gist.github.com/behnamazimi/945d6b7b98bfdd104760c00d74346b55

خروجی مثال بالا به شکل زیر خواهد بود:

https://gist.github.com/behnamazimi/8e70001c232edf257843d913bb025d30

در مثال بالا، سه تا سرویس فراخوانی شده. هر کودوم شناسه منحصر به فرد دارن ولی عدد اول شناسه جایگاه هر سرویس در صف رو نشون میده. همونطور که در قسمت نتایج می بینید، همه ی سرویس ها به نوبت وارد صف فراخوانی شدن. وقتی اولین سرویس وارد صف شده، فوری فراخوانی شده چون اولین سرویس در صف بوده.

سرویس دوم بعد از وارد شدن سرویس اول وارد صد شده. ولی چون نوع سرویس موازی (parallel) نبوده پس باید منتظر میمونده تا نوبت بهش برسه. بعد از سرویس دوم هم، سرویس سوم که تنها سرویس نوع موازی هست وارد صف شده و چون نوعش موازی بوده فوری فراخوانی شده. در این لحظه همه ی سرویس ها وارد صف شدن.

وقتی سرویس اول به نتیجه میرسه resolve میشه و از صف حذف میشه و نوبت میرسه به فراخوانی سرویس دوم که در حالت انتظار بود. هر کودوم از سرویس ها بعد از اتمام اجراشون از صف حذف میشن.

در ابتدای مثال سه بار متد setHook برای ServiceWrapper فراخوانی شده، توابعی که به عنوان پارامتر دوم در هر متد ارسال شده در موقعیت مناسب بر روی تمام سرویس ها اجرا شدن.

چطور باید توی پروژتون استفاده کنید؟

توضیحات کامل در مورد نحوه استفاده و تنظیمات مربوط به کد رو در فایل readme پروژه نوشتم که در Github می تونید مطالعه کنید. پروژه Github

سوالی داشتید در خدمتم.

جاوا اسکریپتjavascript
برنامه نویس
شاید از این پست‌ها خوشتان بیاید