لنفترض سيناريو العمل:
من خلال عنوان RSS ، احصل على RSS وحفظه في الملف ، ويتم حفظ عنوان RSS في الملف.
لإكمال العمل في هذا السيناريو ، هناك حاجة إلى ثلاث مهام:
1. اقرأ عنوان RSS من الملف.
2. احصل على RSS.
3. حفظ في الملف.
أخيرًا ، يتم دمج هذه المهام الثلاث.
يحضر:
الملفات التي تخزن عنوان RSS ، العنوان.
http://programmer.csdn.net/rss_programmer.html
المهمة 1:
اقرأ محتويات ملف عنوان RSS والعودة عبر رد الاتصال.
نسخة الكود كما يلي:
var getRssAddress = function (path ، callback) {
fs.readfile (المسار ، {الترميز: 'Utf8'} ، الدالة (err ، البيانات) {
رد الاتصال (خطأ ، البيانات) ؛
}) ؛
}
المهمة 2:
الوصول إلى RSS من خلال عنوان RSS وإرجاع الخطأ أو البيانات عبر رد الاتصال.
نسخة الكود كما يلي:
var getRss = function (url ، callback) {
var data = '' ؛
http.get (url ، function (res) {
res.on ('Data' ، function (Chrunk) {
البيانات += Chrunk ؛
}) ؛
res.on ('end' ، function () {
رد الاتصال (NULL ، البيانات) ؛
}) ؛
}). on ('error' ، function (err) {
رد الاتصال (ERR ، NULL) ؛
}) ؛
}
المهمة 3:
احفظ RSS في ملف وإرجاع خطأ عبر رد الاتصال.
نسخة الكود كما يلي:
var saverss = function (البيانات ، رد الاتصال) {
fs.writefile ('rss.txt' ، البيانات ، 'UTF8' ، الدالة (err) {
رد الاتصال (ERR) ؛
}) ؛
}
اندماج:
نسخة الكود كما يلي:
getRssaddress ('address.txt' ، function (err ، data) {
إذا (خطأ) {
console.log (err) ؛
يعود؛
}
getRss (البيانات ، الوظيفة (err ، البيانات) {
إذا (خطأ) {
console.log (err) ؛
يعود؛
}
المدخرين (البيانات ، الوظيفة (err) {
if (err) console.log (err) ؛
}) ؛
}) ؛
}) ؛
الكود أعلاه هو معالجة غير متزامنة تماما. يتم استخدام رد الاتصال الأكثر شيوعًا للتعامل مع عودة المنطق غير المتزامن. الميزة هي أن طريقة الكتابة القياسية سهلة على الجميع قبولها ؛ العيب هو أن الاقتران قوي للغاية ، والتعامل مع الاستثناءات هو أن الرمز ليس بديهيًا ، خاصة عند التعامل مع منطق الأعمال المعقدة والعديد من المهام ، فإن عمليات الاسترجاعات ذات الطبقات ستجعل الناس ينظرون إليها وأن الرمز يصعب الحفاظ عليه.
أحد تطبيقات الوعد/المواصفات هو متى.
دعونا نلقي نظرة على الكود المعدل.
المهمة 1:
نسخة الكود كما يلي:
var getRssAddress = function (path) {
var efferred = when.defer () ؛
fs.readfile (المسار ، {الترميز: 'Utf8'} ، الدالة (err ، البيانات) {
إذا (err) deferred.reject (err) ؛
deferred.Resolve (البيانات) ؛
}) ؛
العودة المؤجلة.
}
المهمة 2:
نسخة الكود كما يلي:
var getRss = function (url) {
var efferred = when.defer () ؛
var data = '' ؛
http.get (url ، function (res) {
res.on ('Data' ، function (Chrunk) {
البيانات += Chrunk ؛
}) ؛
res.on ('end' ، function () {
deferred.Resolve (البيانات) ؛
}) ؛
}). on ('error' ، function (err) {
deferred.reject (err) ؛
}) ؛
العودة المؤجلة.
}
المهمة 3:
نسخة الكود كما يلي:
var saverss = function (data) {
var efferred = when.defer () ؛
fs.writefile ('rss.txt' ، البيانات ، 'UTF8' ، الدالة (err) {
إذا (err) deferred.reject (err) ؛
deferred.Resolve () ؛
}) ؛
العودة المؤجلة.
}
اندماج:
نسخة الكود كما يلي:
getRssaddress ('address.txt')
ثم (getRSS)
.
.catch (وظيفة (err) {
console.log (err) ؛
}) ؛
يشرح:
نموذج "المؤجل/الوعد" المحدد من قبل الوعد/المواصفات هو نموذج "النشر/المشترك". يمكن أن يكون نشر الأحداث من خلال الكائن المؤجل حدث حل إكمال أو حدث رفض فاشل ؛ يتم إجراء اشتراكات مكتملة أو فاشلة من خلال كائن الوعد.
في الوعود/المواصفات ، كل مهمة لها ثلاث حالات: الافتراضي (المعلق) ، والوفاء (بالوفاء) ، وفشل (رفض).
1. يمكن نقل الحالة الافتراضية إلى حالة الانتهاء في اتجاه واحد. تسمى هذه العملية حل ، ويتم تأجيل الطريقة المقابلة.
2. يمكن أيضًا نقل الحالة الافتراضية إلى الحالة الفاشلة في اتجاه واحد. تسمى هذه العملية الرفض ، والأسلوب المقابل مؤجّب.
3. في الحالة الافتراضية ، يمكنك أيضًا إعلان معلومات تنفيذ المهمة من خلال efferred.notify (تحديث) ، مثل تقدم التنفيذ ؛
4. نقل الدولة لمرة واحدة. بمجرد أن تتغير المهمة من المعلقة الأولية إلى الحالات الأخرى ، ستدخل عملية التنفيذ للمهمة التالية.
اتبع الرمز أعلاه.
تحديد كائن مؤجل من خلال when.defer.
var efferred = when.defer () ؛
بعد الحصول على البيانات غير المتزامنة بنجاح ، يتم نشر حدث إكمال.
deferred.Resolve (البيانات) ؛
بعد فشل الحصول على البيانات غير المتزامن ، يتم نشر حدث فاشل.
deferred.reject (err) ؛
وإعادة كائن الوعد كاشتراك.
العودة المؤجلة.
الاشتراك هو اشتراك مكتمل/فشل/إخطار من خلال طريقة كائن الوعد آنذاك.
getRssaddress ('address.txt')
ثم (getRSS)
ثم هناك ثلاثة معلمات ، وهي onfulfilled ،
وعد.
المهمة السابقة هي حل (البيانات) ، وسيتم تشغيل وظيفة Onfulfilled ، وسيتم استخدام البيانات كمعلمة لها.
إذا تم رفض المهمة السابقة (العقل) ، فسيتم تشغيل onRejected وسيتم استلام سبب.
في أي وقت ، يمكن تشغيل واحد فقط من onfullized و onredeged ومرة واحدة فقط.
للتعامل مع الاستثناءات ، عندما يوفر js أيضًا طريقة مريحة للغاية. ثم يمكن تمرير الأخطاء. عندما يتم تنفيذ مهام متعددة بشكل متسلسل ، يمكننا فقط تحديد onRequed في آخر ذلك. يمكنك أيضًا الاتصال بوظيفة Catch بعد آخرها لالتقاط أي استثناء من المهمة.
هذه طريقة بسيطة وواضحة لكتابتها.
نسخة الكود كما يلي:
getRssaddress ('address.txt')
ثم (getRSS)
.
.catch (وظيفة (err) {
console.log (err) ؛
}) ؛
يجلب Promise راحة كبيرة للبرمجة غير المتزامنة ، مما يسمح لنا بالتركيز على تنفيذ مهمة واحدة دون الوقوع في مصيبة الهرم. الرمز أعلاه هو الاستخدام الأساسي فقط. عندما توفر js أكثر بكثير من الوظائف المذكورة في هذه المقالة ، يرجى الرجوع إلى واجهة برمجة التطبيقات الرسمية للحصول على التفاصيل.