«توابع بازگشتی» توابعی هستند که به عنوان آرگومان پاس داده میشوند. این الگوی برنامهنویسی دنبالهای از فراخوانی توابع را در برنامهنویسی همگام و ناهمگام ایجاد میکند. نوشتن یک تابع بازگشتی هیچ تفاوتی با نوشتن یک تابع ندارد؛ با این حال، تابع بازگشتی باید با امضایی که تابع فراخوان تعریف کرده است مطابقت داشته باشد.
const squareLength = 5;
// Caller function takes a callback function
function applyToSquare(callback) {
return callback(squareLength);
}
// Callback must expect the possible argument from the calling function
function areaOfSquare(number) {
return number * number;
}
applyToSquare(areaOfSquare); // => 25
همچنین میتوانید توابع بازگشتی را به صورت عبارت تابعی، عبارت تابعی بینام، یا عبارت تابعی پیکانی بنویسید:
applyToSquare(function squarePerimeter(side) {
return side * 4;
});
applyToSquare(function (side) {
return side * 4;
});
applyToSquare((side) => {
return side * 4;
});
شما در حال ساختن یک پورتال آنلاین تازه هستید تا مشتریانتان بتوانند میوهی تازهی خود را از میوهفروش سفارش دهند. میوهفروش یک API دارد که میتوانید با آن بررسی کنید آیا موجودی موردنظر مشتریانتان را دارد یا نه. باید کتابخانهای کوچک از توابع بسازید تا با API میوهفروش تعامل کنید.
پورتال باید در صورت موفق بودن سفارش، به مشتری اطلاع دهد. تابع callback به اسم onSuccess را تعریف کنید؛ این تابع اگر سفارش به دلیل داشتن میوهی کافی در انبار میوهفروش موفق شود، فراخوانی میشود. این تابع باید تابع notify واردشده را فراخوانی کند و { message: 'SUCCESS' } را به آن بدهد تا به مشتری اطلاع دهد که سفارشش موفق بوده است.
onSuccess();
// => `notify` called with `{ message: 'SUCCESS' }`
پورتال باید در صورت ناموفق بودن سفارش، به مشتری اطلاع دهد. تابع callback به اسم onError را تعریف کنید؛ این تابع اگر سفارش ناموفق شود، چون میوهفروش میوه را در انبار ندارد یا خطایی رخ داده است، فراخوانی میشود. این تابع باید تابع notify واردشده را فراخوانی کند و { message: 'ERROR' } را به آن بدهد تا به مشتری اطلاع دهد که سفارشش ناموفق بوده است.
onError();
// => `notify` called with `{ message: 'ERROR' }`
سفارشهای میوه از طریق API میوهفروش و با تابع order که در اختیارتان قرار گرفته ثبت میشوند. این تابع سه آرگومان میگیرد: یک query که variety و quantity میوهی درخواستی را در خود دارد، یک تابع callback که وقتی سفارش موفق میشود فراخوانی میشود، و یک تابع callback که وقتی سفارش به خطا میخورد فراخوانی میشود.
میخواهید کدتان را از تغییرات احتمالی بیرونی ایمن نگه دارید و تصمیم میگیرید فراخوانی تابع order را درون تابع تازهای به اسم orderFromGrocer قرار دهید. تابع orderFromGrocer را پیادهسازی کنید که میکوشد با فراخوانی تابع order در API میوهفروش سفارشی ثبت کند و مطمئن میشود آرگومانهای دادهشده به orderFromGrocer را به فراخوانی API میفرستد.
این query به شکل یک object است:
const query = {
variety: string,
quantity: number,
};
orderFromGrocer(
{ variety: 'pear', quantity: 12 },
exampleSuccessCallback,
exampleErrorCallback,
);
// => `order` was called with the query and the callbacks
مشتریان شما حالا میتوانند از طریق پورتال شما سفارش میوه بدهند، اما متوجه میشوید که تابع orderFromGrocer را در جاهای مختلفی از کدتان فراخوانی میکنید و هر بار باید یک query و دو تابع callback را به عنوان آرگومان بدهید. فرصتی برای بازآرایی کدتان میبینید و فکر میکنید اگر بتوانید فقط با دادن variety و quantity میوهی لازم سفارش ثبت کنید، سادهتر میشود. تابع کمکی postOrder را تعریف کنید که variety و quantity را به عنوان آرگومان میگیرد و میکوشد نزد میوهفروش سفارشی ثبت کند.
postOrder('peach', 100);
// => order placed for 100 peaches
در Exercism ثبتنام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.