قاطف الفواكه

قاطف الفواكه

تمرين تعلّمي

مقدمة

دوال رد الاتصال

دوال رد الاتصال هي دوال تُمرَّر كوسائط. ينشئ هذا النمط البرمجي تسلسلًا من استدعاءات الدوال في البرمجة المتزامنة وغير المتزامنة على حد سواء. لا تختلف كتابة دالة رد الاتصال عن كتابة أي دالة أخرى؛ غير أن دالة رد الاتصال يجب أن تطابق التوقيع الذي تحدده الدالة المستدعية.

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 البقال.

1. أبلغ عميلك عندما ينجح طلبه

على البوابة أن تُبلغ عميلك إذا نجح طلبه. عرّف دالة الاستدعاء الراجعة onSuccess التي ستُستدعى إذا نجح الطلب لأن البقال لديه فاكهة كافية في المخزون. ينبغي أن تستدعي هذه الدالة الدالة notify المستوردة، وتمرّر إليها { message: 'SUCCESS' } لإعلام عميلك بنجاح طلبه.

onSuccess();
// => `notify` called with `{ message: 'SUCCESS' }`

2. أبلغ عميلك عندما يفشل طلبه

على البوابة أن تُبلغ عميلك إذا فشل طلبه. عرّف دالة الاستدعاء الراجعة onError التي ستُستدعى إذا فشل الطلب لأن البقال لا يملك الفاكهة في المخزون أو حدث خطأ. ينبغي أن تستدعي هذه الدالة الدالة notify المستوردة، وتمرّر إليها { message: 'ERROR' } لإعلام عميلك بفشل طلبه.

onError();
// => `notify` called with `{ message: 'ERROR' }`

3. أنشئ غلاف API حول دالة طلب البقال

تُقدَّم طلبات الفاكهة عبر API البقال من خلال الدالة order المتاحة. تستقبل هذه الدالة ثلاثة وسائط: استعلام يحتوي على variety وquantity للفاكهة المطلوبة، ودالة استدعاء راجعة تُستدعى عند نجاح الطلب، ودالة استدعاء راجعة تُستدعى عندما يواجه الطلب خطأ.

تريد أن تعزل الكود الخاص بك عن التغييرات الخارجية المحتملة، فتقرّر أن تلفّ الاستدعاء إلى الدالة order داخل دالة جديدة باسم orderFromGrocer. نفّذ الدالة orderFromGrocer التي تحاول تقديم طلب عبر استدعاء الدالة order في API البقال، مع الحرص على تمرير الوسائط التي يستقبلها orderFromGrocer إلى استدعاء API.

يتخذ الاستعلام شكل كائن:

const query = {
  variety: string,
  quantity: number,
};
orderFromGrocer(
  { variety: 'pear', quantity: 12 },
  exampleSuccessCallback,
  exampleErrorCallback,
);
// => `order` was called with the query and the callbacks

4. بسّط التعامل مع الطلبات المُقدَّمة

أصبح عملاؤك الآن قادرين على تقديم طلبات الفاكهة عبر بوابتك، لكنك تلاحظ أنك تستدعي الدالة orderFromGrocer في أماكن كثيرة مختلفة في الكود، وفي كل مرة عليك تمرير query ودالتَي callback كوسائط. وبعد أن سنحت لك فرصة إعادة هيكلة الكود، ترى أنه سيكون أبسط لو تمكنت من تقديم طلب بمجرد تمرير variety وquantity للفاكهة المطلوبة. عرّف الدالة المساعدة postOrder التي تأخذ variety وquantity كوسائط وتحاول تقديم طلب إلى البقال.

postOrder('peach', 100);
// => order placed for 100 peaches
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
JavaScript Exercism

مستعد لبدء قاطف الفواكه؟

سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.