أثناء عملية كتابة Node.js ، قد تؤدي عمليات IO المستمرة إلى "كابوس هرم". إن التعشيش المتعدد لوظائف رد الاتصال يجعل الكود صعبًا. يتم استخدام وعد CommonJS لتغليف الوظائف غير المتزامنة واستخدام واجهة برمجة تطبيقات سلسلة موحدة للتخلص من كابوس عمليات الاسترداد المتعددة.
يتيح لنا نموذج IO غير المحظور الذي توفره Node.js استخدام وظائف رد الاتصال للتعامل مع عمليات IO ، ولكن عندما تكون عمليات IO المستمرة مطلوبة ، سيتم متداخلة وظائف رد الاتصال الخاصة بك عدة مرات ، والرمز ليس جميلًا ، وليس من السهل الحفاظ عليه ، وقد يكون هناك العديد من الرموز المتكررة لمعالجة الأخطاء ، وهي "Pyramid".
نسخة الكود كما يلي:
Step1 (function (value1) {
Step2 (value1 ، function (value2) {
Step3 (value2 ، function (value3) {
Step4 (value3 ، function (value4) {
// افعل شيئًا مع Value4
}) ؛
}) ؛
}) ؛
}) ؛
هذه هي في الواقع مشكلة تدفق التحكم في Node.js. هناك العديد من الحلول لهذه المشكلة ، مثل استخدام Async ، EventProxy ، إلخ. ومع ذلك ، فإن موضوع هذه المقالة هو استخدام الوعد في مواصفات CommonJS لحل هذه المشكلة.
ما هو الوعد؟
هناك العديد من أنواع مواصفات الوعد لـ CommonJs. نناقش عمومًا مواصفات الوعد/A+ ، والتي تحدد السلوك الأساسي للوعد.
الوعد هو كائن يمثل عادة عملية غير متزامنة قد تكتمل في المستقبل. قد تنجح هذه العملية أو تفشل ، لذا فإن كائن الوعد له عمومًا 3 حالات: معلق ، وإنجاز ، ورفض. إنه يمثل فشلًا غير مكتمل ، وفشل في التشغيل ، على التوالي. بمجرد أن تتغير حالة الوعد من المعلقة إلى إما الوفاء أو رفضها ، لا يمكن تغيير حالتها مرة أخرى.
عادةً ما يكون لكائن الوعد طريقة آنذاك ، والتي تتيح لنا تشغيل القيمة التي يتم إرجاعها بعد النجاح المحتمل في المستقبل أو سبب الفشل. هذه الطريقة ثم تبدو هكذا:
وعد.
من الواضح أن الطريقة آنذاك تقبل معلمتين ، والتي عادة ما تكون وظيفتين ، يتم استخدام واحدة لمعالجة النتيجة بعد نجاح العملية ، والآخر يستخدم لمعالجة سبب فشل العملية. المعلمات الأولى لهاتين وظيفتين هي النتيجة بعد النجاح وسبب الفشل. إذا كانت الطريقة التي لا هي وظيفة ، فسيتم تجاهل هذه المعلمة.
قيمة الإرجاع للطريقة التين ثم كائن الوعد ، والذي يسمح لنا بسلسلة الاتصال ثم تحقيق تأثير التحكم في العملية. هناك العديد من التفاصيل هنا ، مثل نقل القيمة أو معالجة الأخطاء. يتم تعريف مواصفات الوعد على هذا النحو:
لا تعد قيمة الإرجاع لوظيفة Onfulfilled أو onReveled كائن وعد ، ثم سيتم استخدام القيمة كمعلمة أول من onfulfilled في الطريقة التالية ثم الطريقة. إذا كانت قيمة الإرجاع كائن وعد ، فكيف يمكن أن تكون قيمة الإرجاع للطريقة ثم كائن الوعد
إذا تم إلقاء استثناء في وظيفة onfulfiled أو onRejected ، يتم تحويل حالة كائن الوعد الذي تم إرجاعه إلى الرفض. إذا استدعاء كائن الوعد ، فسيتم استخدام كائن الخطأ كمعلمة الأولى لوظيفة onRejected.
إذا تم الوفاء بحالة الوعد ولم يتم توفير وظيفة onfulfiled في الطريقة التي آنذاك ، فإن حالة كائن الوعد التي يتم إرجاعها بواسطة الطريقة ثم تتحقق والنتيجة الناجحة هي نتيجة الوعد السابق ، وينطبق الشيء نفسه على رفضه.
للإضافة ، يتم تنفيذ كل من onfulfilled و onRexed بشكل غير متزامن.
تنفيذ المواصفات: ف
ما سبق يدور حول مواصفات الوعد ، وما نحتاجه هو تنفيذها. س هي مكتبة لديها مواصفات تنفيذ أفضل لـ Promise/A+.
بادئ ذي بدء ، نحن بحاجة إلى إنشاء كائن وعد. مواصفات إنشاء كائن الوعد في وعد/ب. لن أشرح بالتفصيل هنا ، فقط أضف الرمز.
نسخة الكود كما يلي:
وظيفة (العلم) {
var defer = q.defer () ؛
fs.readfile ("A.TXT" ، الدالة (err ، البيانات) {
إذا (err) defer.reject (err) ؛
آخر refer.Resolve (البيانات) ؛
}) ؛
إرجاع refer.promise ؛
}
معظم تطبيقات الوعد متشابهة في إنشاء الوعد. من خلال إنشاء كائن مؤجل مع سمة الوعد ، إذا تم الحصول على القيمة بنجاح ، يتم استدعاء Defer.Resolve (القيمة) ، إذا فشلت ، يتم استدعاء Rive.Reject (العقل) ، وأخيراً تُرجع سمة الوعد للتأجيل. يمكن فهم هذه العملية على أنها استدعاء مؤشر. يحول حل حالة الوعد إلى الوفاء ، والاتصال بتأجيل.
عند مواجهة سلسلة من الأساليب غير المتزامنة المستمرة ، كيف يمكنك كتابة رمز جميل باستخدام الوعد؟ ألق نظرة على المثال التالي.
نسخة الكود كما يلي:
Promise0.Then (وظيفة (النتيجة) {
// dosomething
نتيجة العودة
}). ثم (الوظيفة (النتيجة) {
// dosomething
عودة الوعد 1 ؛
}). ثم (الوظيفة (النتيجة) {
// dosomething
}). catch (function (ex) {
console.log (ex) ؛
}). أخيرًا (function () {
console.log ("النهائي") ؛
}) ؛
في الكود أعلاه ، تقبل الطريقة التي آنذاك فقط onfulfilled ، وطريقة الصيد هي في الواقع (NULL ، onRECEDED). وبهذه الطريقة ، طالما أن سلسلة من الأساليب غير المتزامنة تُرجع دائمًا القيم بنجاح ، فسيتم تشغيل الكود لأسفل بأسلوب الشلال. في حالة فشل أي من الأساليب غير المتزامنة أو حدوث استثناء ، وفقًا لمواصفات وعد CommonJS ، سيتم تنفيذ الوظيفة في المصيد. توفر Q أيضًا طريقة أخيرًا ، والتي يسهل فهمها حرفيًا ، أي ما إذا كانت تحل أو ترفض ، سيتم تنفيذ الوظيفة في النهاية.
يبدو جيدًا ، يتم الحفاظ على الكود أكثر وجميلة ، فماذا لو كنت تريد التزامن؟
نسخة الكود كما يلي:
س.
console.log (الحجج) ؛
}). ثم (الدالة () {
console.log ("Done") ؛
}). catch (function (err) {
console.log (err) ؛
}) ؛
يوفر Q أيضًا واجهة برمجة تطبيقات للتزامن ، حيث يمكن أن يستدعي استدعاء جميع الأساليب وتمرير صفيف الوعد في استخدام نمط سلسلة آنذاك. هناك أيضًا أشياء جيدة مثل Q.Nfbind ، وما إلى ذلك يمكنها تحويل واجهة برمجة تطبيقات Node.js الأصلية إلى وعد بتوحيد تنسيق الكود. لن يتم وصف المزيد من واجهات برمجة التطبيقات بالتفصيل هنا.
ختاماً
تقدم هذه المقالة بشكل أساسي استخدام الوعد لحل مشكلة تدفق التحكم Node.js ، ولكن يمكن أيضًا تطبيق الوعد على الواجهة الأمامية. قدمت EmcaScript6 دعم API الأصلي. تجدر الإشارة إلى أن الوعد ليس هو الحل الوحيد ، فإن Async هو أيضًا خيار جيد ويوفر واجهة برمجة تطبيقات أكثر ودية للتحكم في التزامن ، لكنني أعتقد أن الوعد لديه المزيد من المزايا عند تغليف الوظائف ذات الأساليب غير المتزامنة.
حسنًا ، هذا كل شيء بالنسبة لهذا المقال ، آمل أن يكون ذلك مفيدًا للجميع.