بهطوریکه در پست قبلی نوشتم، تابع بازخوان یا callback تابعی است که بهعنوان پارامتر به یک تابع ناهمگام (asynchronous) داده میشود تا پس از اتمام کار تابع، فراخوانی شود. معمولاً زمانی که کار تابع ناهمگام به انجام رسید، آن تابع، تابع بازخوان را با مقدار حاصل از عملیات انجام شده، فراخوانی میکند. در ضمن، بعضی از اوقات دو تابع بازخوان به تابع ناهمگام داده میشود. یکی از آنها برای زمانی است که عملیات با موفقیت انجام شده است و تابع بازخوان دیگر برای حالتی که خطایی بروز کرده است. در این حالت، تابع ناهمگام، تابع بازخوان مربوط به خطا را با شیء استثنای مربوط به خطای بروز کرده، فراخوانی میکند.
بسیاری از توابع موجود در رابط برنامهنویسی NodeJS از توابع بازخوان استفاده میکنند. در این محیط برنامهنویسی، روش معمول به این صورت است که تابع بازخوان دارای دو پارامتر است، پارامتر اول خطا نام دارد و پارامتر دوم نتیجه. در صورتی که خطایی بروز کند، استثنای ایجاد شده در پارامتر اول به تابع بازخوان داده میشود. در غیر این صورت، مقدار پارامتر اول هیچ است و پارامتر دوم نتیجهی عملیات ناهمگام انجام شده را در بر دارد.
با آنکه توابع بازخوان انجام عملیات ناهمگام را بسیار آسان میکنند، ولی در صورتی که عملیات متعددی قرار باشد که بهصورت ناهمگام اجرا شود، باید از توابع ناهمگام متعددی بهصورت تو در تو استفاده شود که این سبب میشود که متن برنامه تا حدودی ناخوانا و غیرقابل فهم شود، و اشکالزدایی آن نیز دشوارتر شود.
اشیای Promise این مشکل را تا حدودی حل میکنند. به این صورت که در این اشیای «وعده»، تابع بازخوان با استفاده از متد then تعریف میشود و بنابراین، میتوان به جای ساختار تو در تو، عملیات ناهمگام متوالی را بهصورت پشت سر هم نوشت. در این مورد در پستهای بعدی بیشتر توضیح خواهم داد.