وظائف جافا سكريبت كسول

مرحبا


فكرت هنا أن أخبركم عن كيفية إنشاء واستخدام وظائف كسول في JavaScript باستخدام مكتبة Fluture. ستكون هذه نظرة عامة موجزة على كيفية إنشاء وظائف ، وكيفية التعامل مع الأخطاء ، وقليلا عن التزامن. أدمغة البرمجة الوظيفية لن أرتفع! أعدك!


Fluture


Fluture هي مكتبة تم تطويرها بواسطة المطور Aldwin Vlasblom الذي ينفذ Future. Future بديل لـ Promise ، والذي يحتوي على واجهة برمجة تطبيقات أكثر فاعلية تسمح بتنفيذ الإلغاء ، والتكرار الآمن ، والتنفيذ "الخالي من الأخطاء" (باستخدام إما) وعربة صغيرة من الميزات الرائعة.


أعتقد أنه يجدر إخبارك بالطرق (الموناديات) التي سأستخدمها في الأمثلة أدناه.


  • .of(Any) - يخلق المستقبل من القيمة التي تم تمريرها
  • .map(Function) - لا ، هذه ليست Array.map ، هذه دالة تحويل تشبه Promise.then
  • .chainRej(Function) - مثل Promise.catch يمسك خطأ
  • .fork(Function, Function) - يبدأ التنفيذ في المستقبل

خلق وظيفة كسول


بنفسي ، سلطت الضوء على نهجين رئيسيين لإنشاء وظائف كسولة في Fluture. تتمثل الطريقة الأولى في إنشاء دالة تقبل البيانات المصدر وترسل مستقبلًا جاهزًا للتنفيذ. الطريقة الثانية هي أن نخلق المستقبل بكل التحولات الموصوفة ، ثم ننقل البيانات إليه.


غير واضح لنأخذ مثالا! لدينا مثل هذه الوظيفة


 const multiply10 = x => x * 10; 

الآن جعلها كسول باستخدام النهج الأول


 const multiply10 = x => x * 10; const lazyMultiply10 = (x) => Future .of(x) //  Future   .map(multiply10); //     lazyMultiply10(2).fork(console.error, console.log); // -> 20 

ضخم جدًا ، أليس كذلك؟ دعونا نحاول أن نكتب بإيجاز أكثر باستخدام النهج الثاني.


 const multiply10 = x => x * 10; const lazyMultiply10 = Future.map(multiply10); const value = Future.of(2); //     Future lazyMultiply10(value).fork(console.error, console.log); // -> 20 

بالفعل أفضل ، ولكن لا تزال مرهقة. يجب أن يكون أكثر إحكاما!


 const lazyMultiply10 = Future.map(x => x * 10); lazyMultiply10(Future.of(2)).fork(console.error, console.log); // -> 20 

في الواقع ، هذه الأساليب ليست حصرية بشكل متبادل ويمكن استخدامها معًا.


 const lazyMultiply10 = Future.map(x => x * 10); const someCalculation = a => Future .of(a) .map(v => v + 1) .chain(v => lazyMultiply10(Future.of(v)); someCalculation(10).fork(console.error, console.log); // -> 110 

خطأ في التعامل


خطأ في معالجة في المستقبل لا يختلف عمليا عن معالجة الأخطاء في وعد. دعنا تذكر تخيل وظيفة تقدم طلبًا لواجهة برمجة تطبيقات لجهة خارجية وليست مستقرة جدًا.


 const requestToUnstableAPI = query => request({ method: 'get', uri: `http://unstable-site.com/?${query}` }) .then(res => res.data.value) .catch(errorHandler); 

نفس الوظيفة ، ولكن ملفوفة في المستقبل


 const lazyRequestToUnstableAPI = query => Future .tryP(() => request({ method: 'get', uri: `http://unstable-site.com/?${query}` })) .map(v => v.data.value) .chainRej(err => Future.of(errorHandler(err)); 

في الواقع ، يمكن جعل معالجة الأخطاء أكثر مرونة. للقيام بذلك ، نحتاج إلى الهيكلين ، وهذا الصغر خارج نطاق مراجعتي.


التزامن


للعمل مع التوازي ، يطبق Future race(Futures[]) طريقتين race(Futures[]) (على غرار Promise.race ) ، parallel(n, Futures[]) both(Future, Future) ، لكنها حالة خاصة parallel .


تأخذ الطريقة parallel وسيطين ، عدد المستقبل الموازي والصفيف مع المستقبل. لجعل السلوك parallel Promise.all لطريقة Promise.all ، تحتاج إلى تعيين عدد Promise.all لتعيين كـ Infinity .


هنا ، أيضًا ، لا يمكننا الاستغناء عن الأمثلة.


 const requestF = o => Future.tryP(() => request(o)); const parallel1 = Future.parallel(1); const lazyReqs = parallel1( [ 'http://site.com', 'http://another-site.com', 'http://one-more-site.com', ] .map(requestF) ); lazyReqs.fork(console.error, console.log); // -> [Result1, Result2, Result3] 

وعد متوافق


لا يوجد مكان لـ Promise في جافا سكريبت ، ومن غير المرجح أن يكون أي شخص سعيدًا إذا كانت طريقتك تُرجع بعض المستقبل الغامض. للقيام بذلك ، يحتوي Future على طريقة .promise() ، والتي ستبدأ في تنفيذ Future .promise() في Promise.


 Future .of(10) .promise(); // -> Promise{value=10} 

المراجع



ربما هذا هو كل ما أردت أن أخبرك به. إذا كان الموضوع مثيرًا ، فأخبرني بذلك ، وسأخبرك المزيد عن معالجة الأخطاء. ونعم ، لا تأنيب كثيرًا ، فهذه هي أول مشاركة لي في حبري.

Source: https://habr.com/ru/post/ar435838/


All Articles