تعد عمليات الاسترجاعات الموجودة في كل مكان في JavaScript كارثة للتحكم في العملية ، وعيوبها واضحة:
1. بدون عودة صريحة ، من السهل إنشاء عمليات وخلل غير ضرورية ناتجة عنهم.
2. الكود متداخل بلا حدود ويصعب قراءته.
دعنا نتحدث عن كيفية حل المشاكل المذكورة أعلاه وتجنبها.
المشكلة الأولى هي مشكلة عادة. عند استخدام رد الاتصال ، غالبًا ما ينسى الناس استخدام العودة. هذا الموقف صحيح بشكل خاص عند استخدام Coffee-Script (على الرغم من أنه يجمع البيانات الأخيرة كقيمة الإرجاع عند تجميعها في JavaScript ، فإن قيمة الإرجاع هذه لا تمثل بالضرورة نيتك الأصلية). ألق نظرة على المثال أدناه.
نسخة الكود كما يلي:
a = (err ، رد الاتصال)->
رد الاتصال () إذا أخطأ؟
console.log "سوف تراني"
ب = ->
console.log "أنا رد الاتصال"
(خطأ "، ب)
في هذا النمط من رمز "الخطأ أولاً" ، من الواضح أننا لا نريد أن يتم تنفيذ الكود اللاحق في الطريقة A عند حدوث خطأ ، لكننا لا نريد استخدام رمي لجعل العملية بأكملها شنقًا (يجب أن تموت برشاقة ~) ، وبالتالي فإن الكود أعلاه سوف يسبب الأخطاء.
حل واحد هو الكتابة بصدق إذا ... آخر ... ، لكني أفضل ما يلي:
نسخة الكود كما يلي:
a = (err ، رد الاتصال)->
إرجاع رد الاتصال () إذا أخطأ؟
console.log "لن تراني"
ب = ->
console.log "أنا رد الاتصال"
(خطأ "، ب)
معظم قيم الإرجاع في الطرق غير المتزامنة JavaScript غير مجدية ، لذلك نستخدم هنا دورًا في عملية التحكم في العملية ، مع رمز أقل من ... آخر ... ولكن أكثر وضوحًا.
المشكلة الثانية هي أنه من الصعب القضاء.
هناك طريقة جيدة تتمثل في استخدام بعض وحدات التحكم في العملية لجعل الكود يظهر أكثر تنظيماً. على سبيل المثال ، Async هي وحدة جيدة توفر سلسلة من الواجهات ، بما في ذلك التكرار والحلقات وبعض البيانات الشرطية ، وحتى نظام قائمة الانتظار. يمكن استخدام الأمثلة التالية لوصف مزايا وعيوب الطريقتين لكتابة الأسماء.
نسخة الكود كما يلي:
#طبيعي
أولا = (رد الاتصال)->
console.log "أنا الوظيفة الأولى"
أتصل مرة أخرى()
الثاني = (رد الاتصال)->
console.log "أنا الوظيفة الثانية"
أتصل مرة أخرى()
الثالث = ()->
console.log "أنا الوظيفة الثالثة"
أولا ->
الثاني ->
ثالث()
# استخدم ASYNC
Async = طلب ('Async')
Async.waterfall [
أولاً،
ثانية،
ثالث
] ، (err)->
كشخص حكيم ، أي واحد تختار؟