كان هناك قدر كبير من الضجة اليوم حول الاقتراح الجديد لمشغل التعيين الآمن (؟=) في JavaScript. أحب الطريقة التي تحسنت بها JavaScript بمرور الوقت، ولكن هذه أيضًا مشكلة واجهتها في بعض الحالات مؤخرًا. يجب أن أقوم بتنفيذ مثال سريع كدالة، أليس كذلك؟
في حال لم تقرأ الاقتراح، إليك ما يقترحه:
const [error, value] ?= maybeThrows();
سيكون عامل التشغيل ?= الجديد مكافئًا لاستدعاء الجانب الأيمن من المهمة في كتلة محاولة/التقاط، وإرجاع مصفوفة. ستكون القيمة الأولى للمصفوفة التي تم إرجاعها خطأ إذا تم إلقاء شيء ما داخل المهمة، وستكون القيمة الثانية نتيجة المهمة إذا لم يتم إلقاء أي شيء.
كثيرًا ما أصطدم بالكود الذي يبدو قبيحًا جدًا حول المهام ومحاولة/التقاط الكتل. أشياء مثل هذا:
let errorMsg; try { maybeThrow(); } catch (e) { errorMsg = "An error message"; }
للوصول إلى errorMsg خارج كتلة المحاولة/التقاط باستخدام const أو السماح لك بتعريفها خارج الكتلة.
الحالة الأسهل هنا هي التعامل مع الوظائف غير المتزامنة. لقد تمكنت من التحفيز
بعض حالات الاختبار ووظيفة تسمى TryCatch في لمح البصر:
function tryCatch(fn, ...args) { try { return [undefined, fn.apply(null, args)] } catch (e) { return [e, undefined]; } } function throws() { throw new Error("It threw"); } // returns a sum // prints [ undefined, 2 ] console.log(tryCatch(Math.sqrt, 4)); // returns an error // prints [ Error: 'It threw', undefined ] console.log(tryCatch(throws));
tryCatch يستدعي الدالة مع الوسيطات المحددة المضمنة في كتلة حاول/قبض. تُرجع بشكل مناسب [غير محدد، نتيجة] إذا لم يتم إلقاء أي شيء داخل الوظيفة، و[خطأ، غير محدد] إذا تم إلقاء شيء ما.
لاحظ أنه يمكنك استخدام وظيفة مجهولة مع TryCatch أيضًا إذا لم تكن لديك وظيفة جاهزة للاتصال بها.
console.log(tryCatch(() => { throw new Error("It threw"); }));
تصبح وظائف المزامنة أكثر تعقيدًا بعض الشيء. إحدى الأفكار التي كانت لدي في البداية كانت كتابة
إصدار غير متزامن تمامًا، ربما يسمى asyncTryCatch، ولكن أين يكمن التحدي في ذلك. هذا استكشاف لا معنى له على الإطلاق! إليك تطبيق TryCatch الذي يعمل مع كل من الوظائف غير المتزامنة وغير المتزامنة:
function tryCatch(fn, ...args) { try { const result = fn.apply(null, args); if (result.then) { return new Promise(resolve => { result .then(v => resolve([undefined, v])) .catch(e => resolve([e, undefined])) }); } return [undefined, result]; } catch (e) { return [e, undefined]; } } function throws() { throw new Error("It threw"); } async function asyncSum(first, second) { return first second; } async function asyncThrows() { throw new Error("It throws async"); } // returns a sum // prints [ undefined, 2 ] console.log(tryCatch(Math.sqrt, 4)); // returns an error // prints [ Error: 'It threw', undefined ] console.log(tryCatch(throws)); // returns a promise resolving to value // prints [ undefined, 3 ] console.log(await tryCatch(asyncSum, 1, 2)); // returns a promise resolving to error // prints [ Error: 'It throws async', undefined ] console.log(await tryCatch(asyncThrows));
يشبه إلى حد كبير الإصدار الأصلي، ولكن مع بعض التعليمات البرمجية المستندة إلى الوعد
ألقيت في لحسن التدبير. باستخدام هذا التنفيذ، يمكنك استدعاء TryCatch عند استدعاء دالة غير متزامنة، ثم استدعاء waitCatch عند استدعاء دالة غير متزامنة.
دعونا نلقي نظرة على جزء الوعد:
if (result.then) { return new Promise(resolve => { result .then(v => resolve([undefined, v])) .catch(e => resolve([e, undefined])) }); }
if (result.then) يتحقق مما إذا كانت الوظيفة المحددة (التي يتم استدعاؤها مع تطبيق) قد أعادت وعدًا. إذا حدث ذلك، فنحن بحاجة إلى إعادة الوعد بأنفسنا.
استدعاء النتيجة. ثم (v => Resolve([unified, v])) يؤدي إلى حل الوعد بالقيمة التي ترجعها الدالة المحددة، إذا لم يحدث أي شيء.
.catch(e => Resolve([e, uncategorized])) أكثر تعقيدًا بعض الشيء. لقد كتبت في الأصل
كـ .catch(e => Deject([e, undefine])))، ولكن هذا يتسبب في حدوث خطأ لم يتم اكتشافه
لتسقط من TryCatch. نحن بحاجة إلى حل هنا لأننا نعيد
صفيف، وليس رمي خطأ.
لدي بانتظام حالات أحتاج فيها إلى المحاولة/اللحاق ولكني أشعر بأنني
تشغل كتلة المحاولة/الالتقاط الواضحة مساحة كبيرة وهي مزعجة لتحديد نطاق المهام. لست متأكدًا مما إذا كنت سأستخدمه أم لا، ولكن كان هذا استكشافًا صغيرًا وممتعًا.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3