يتميز جافا سكريبت بالتزامن. JavaScript لا يمكن أن تنتظر. إذا قمت بتطبيق شيء يحتاج إلى انتظار ، فلا يمكنك التوقف عند هذا الحد وانتظار العودة. على العكس من ذلك ، فإن النتيجة النهائية هي استخدام رد الاتصال على رد الاتصال: يمكنك تحديد وظيفة ، والتي لا يمكن استدعاؤها إلا حتى تتوفر النتيجة.
لا يملك نموذج رد الاتصال هذا مشكلة مع تنظيم الرمز الجيد ، ولكن يمكنه أيضًا حل العديد من المشكلات عن طريق التحول من رد الاتصال الأصلي إلى الوعد. تعامل مع الوعد كحاوية بيانات قياسية ، والتي ستبسط مؤسسة التعليمات البرمجية الخاصة بك وتصبح بنية قائمة على الوعد.
ما هو الوعد؟
الوعد هو كائن مع طريقة ".Then ()" ، والتي تمثل نتيجة عملية قد لا تكون معروفة بعد. بغض النظر عمن يصل إلى هذا الكائن ، يمكنه استخدام طريقة ".Then ()" لإضافة رد اتصال لانتظار تذكير لانتظار العملية لتحقيق نتيجة أو فشل ناجح.
فلماذا تعتبر فوائد القيام بذلك بشكل أفضل من عمليات الاسترجاعات؟ يتطلب وضع رد الاتصال القياسي أن نقدم وظائف رد الاتصال في نفس الوقت عند معالجة الطلبات:
طلب (url ، الدالة (خطأ ، استجابة) {// التعامل مع النجاح أو الخطأ.}) ؛ dosomethingelse () ؛لسوء الحظ ، يعني هذا الرمز أن وظيفة الطلب هذه لا تعرف متى سيتم إكمالها بنفسها ، وبالطبع ليس من الضروري. نمر أخيرًا النتيجة من خلال رد الاتصال. يؤدي هذا إلى تكوين عمليات الاسترجاعات المتعددة لتكوين عمليات الاسترجاعات المتداخلة ، أو مصائد رد الاتصال.
QueryTheDatabase (استعلام ، وظيفة (خطأ ، النتيجة) {request (url ، function (error ، reponse) {dosomethingElse (response ، function (error ، struction) {doanotherthing (result ، function (error ، result)يمكن أن يحل الوعد هذه المشكلة عن طريق السماح لإنشاء رمز منخفض المستوى بإنشاء طلب ثم إرجاع كائن ، وهو ما يمثل عملية غير مكتملة ، مما يسمح للمتصل بتحديد أي عوائد يجب إضافة عوائد.
ما هو الوعد؟
الوعد هو تجريد من البرمجة غير المتزامنة. إنه كائن وكيل يعيد قيمة أو يرمي استثناء. بشكل عام ، فإن الكائنات الوعد لها طريقة آنذاك. هذه الطريقة ثم الطريقة التي نحصل بها على قيمة الإرجاع (تسمى قيمة النتيجة للتنفيذ الناجح للوعد الوفاء) أو رمي استثناء (سبب رفض الوعد يسمى الرفض). بعد ذلك ، استخدم عوامل عاتق اختيارية كمعلمات ، والتي يمكننا تسميتها onfulfilled و onredeged:
var الوعد = dosomethingaync ()
وعد.
عندما يتم حل هذا الوعد ، أي بعد اكتمال العملية غير المتزامنة ، سيتم استدعاء إما onfulfilled و onrequed.
لذلك ، فإن الوعد له الدول الثلاث التالية:
■ معلقة للوعد - حالة الوعد الأولية
■ الوفاء بالتزام التنفيذ-الالتزام حالة التنفيذ الناجح
■ رفض رفض الالتزام - دولة حيث فشل الوعد
أخذ ملف القراءة كحالة ، ما يلي هو ما ينبغي القيام به بعد قراءة الملف باستخدام رد الاتصال (طباعة الإخراج):
ReadFile (function (err ، data) {if (err) return console.error (err) console.log (data)})إذا أدت وظيفة رعايةنا إلى الوعد ، فيمكننا تنفيذ نفس المنطق على النحو التالي (طباعة الإخراج):
var الوعد = ReadFile ()
Promise.Then (console.log ، console.error)
هنا لدينا وعد القيمة الذي يمثل عملية غير متزامنة. يمكننا تمرير وعد القيمة هذا طوال الوقت. يمكن لأي شخص يصل إلى هذه القيمة استخدامها لاستهلاكها. بغض النظر عما إذا كانت العملية غير المتزامنة التي تمثلها هذه القيمة قد اكتملت أو لم تكتمل ، يمكننا أيضًا التأكد من أن النتيجة غير المتزامنة لن تتغير ، لأن العملية غير المتزامنة التي تمثلها هذا الوعد لن يتم تنفيذها إلا مرة واحدة ، وإما أن يتم الوفاء بالدولة أو رفضها.
فهم الوعد
قد يكون الوعد مختلفًا عن الحدس اليومي. من أجل فهم ذلك ، يجب أن تضع بعض المبادئ المهمة في الاعتبار: ثم يعيد دائمًا وعدًا جديدًا. كما هو موضح في الكود التالي:
var الوعد = ReadFile ()
var promise2 = promise.then (Readanotherfile ، console.error)
هنا المعلمة آنذاك readanotherfile ، console.error تمثل الإجراء onfulfilled بعد أن تكون العملية غير المتزامنة ناجحة أو الإجراء الذي تم تحديده بعد نجاح الفشل. وهذا يعني ، بعد تنفيذ وظيفة ReadanotherFile ، وإلا فإن سجل الطباعة الفاشل غير صحيح. هذا التنفيذ ممكن فقط بطريقتين.
دعونا نلقي نظرة على الكود التالي:
var promise = readfile () var promise2 = promise.Then (function (data) {return readanotherfile () // إذا نجحت ReadFile ، تنفذ readanotherfile} ، الدالة (err) {console.Error (err) // if readfile غير ناجحة ، regly execute readanotherfile return return returnerfile () نتيجة وظيفة Readanotherfileلأنه بعد ذلك يعيد الوعد ، فهذا يعني أن الوعد يمكن إنفاقه عن طريق تسلسل السلسلة التسلسلية ، والتي يمكن أن تتجنب جحيم رد الاتصال:
ReadFile () .Then (Readanotherfile).
هناك جزءان من قاعدة الوعد التي يجب فصلها:
(1). ثم يعيد دائمًا وعدًا جديدًا. في كل مرة تسميها ، لا يهم ما يفعله رد الاتصال ، لأن .then () يمنحك بالفعل وعدًا قبل استدعاء رد الاتصال. يؤثر سلوك رد الاتصال فقط على تنفيذ وعد الوعد. إذا أعاد رد الاتصال قيمة ، فسيستخدم الوعد هذه القيمة. إذا كانت هذه القيمة وعدًا ، فقم بإرجاع القيمة بعد تنفيذ الوعد لهذه القيمة. إذا كان رد الاتصال يلقي خطأ ، فإن الوعد سوف يرفض الخطأ.
(2) الوعد الذي تم إرجاعه بواسطة .then () هو وعد جديد ، وهو مختلف عن تلك. تخفي السلسلة الطويلة من الوعود في بعض الأحيان حقيقة أنه ، بغض النظر عن ذلك ، فإن كل مكالمة. ثم () ستنتج وعدًا جديدًا. ما يجب عليك ملاحظته هنا هو أن ما تحتاجه حقًا هو أن مكالمتك الأخيرة. ثم قد تمثل الفشل ، لذلك إذا لم تقم بالتقاط هذا الفشل ، فمن السهل أن تختفي استثناء خطأك.
يعتقد بعض الناس أن استدعاء سلسلة. then () تشبه إلى حد كبير الأسلوب بطلاقة ، ولكن سلسلة الوعد الطويلة ستكون مربكة وتقسيم أخيرًا إلى وظائف ذات معنى:
وظيفة getTasks () {return $ http.get ('http://example.com/api/v1/tasks') .Then (function (response) {return response.data ؛}) ؛} function getMyTasks () {return getTasks (). }) ؛}في هذا المثال ، يحصل كل منهما على وعد ، يحملان وظيفة رد الاتصال.
وعد مثير للاهتمام
يمكن للوعد نفسه قبول أي عدد من عمليات الاسترجاعات. عند حل الوعد وتنفيذه ، سيتم استدعاء جميع وظائف رد الاتصال. بالإضافة إلى ذلك ، يمكن للوعد حتى قبول رد اتصال جديد بعد حله وتنفيذه. يمكن استدعاء عمليات الاسترجاعات هذه بطريقة طبيعية ، والتي تتيح لنا استخدام عمليات الاسترجاعات لتنفيذ شكل بسيط من ذاكرة التخزين المؤقت:
VAR TASKSPROMISE ؛ وظيفة getTasks () {TaskPromise = TaskPromise || getTaskSfromTheserver () ؛ إرجاع مهام العمل ؛}في هذه الحالة ، يمكن تسمية وظيفة getTasks () أي عدد من المرات ، فإنها تُرجع دائمًا وعد الأسنان النحاسية ، حيث يتم استدعاء وظيفة getTasksFromTheserver () مرة واحدة فقط.
استخدام وعد NodeJS أعلاه هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.