المعيار الجديد يضيف الوعد الأصلي.
سنناقش هنا فقط استخدام السلاسل ونفكر في التفاصيل.
1. مراجعة ثم () و catch ()
يمكن وضع وظيفة رد الاتصال في معلمات Then () و catch () لتلقي النتيجة النهائية للوعد.
ثم () يمكن أن تتلقى معلمة ، ثم سيتم استدعاء رد الاتصال هذا فقط عند حل الوعد ().
ثم () يمكن أيضًا الحصول على معلمة ثانية ، ويتم استخدام رد الاتصال الثاني للتعامل مع موقف الرفض () الوعد.
catch () على وجه التحديد يتعامل مع الوضع الرفض ().
بمعنى آخر ، يمكن استخدام () في كلا الاتجاهين ، ويمكن أن يتعامل Catch () فقط مع الرفض (). ومع ذلك ، يوصى باستخدام ثم () للتعامل مع Resolve () و catch () للتعامل مع الرفض ().
2. ومع ذلك ، ما أريد أن أتحدث عنه ليس ما سبق. ما سبق هو مجرد مراجعة للاستخدام الأساسي. سنبدأ هنا بتفاصيل قيم الإرجاع واستخدام السلسلة من Then () وطريقة Then ().
ثم تقول الوثائق الرسمية أن كلا من () و catch () يعيدون وعدًا ، وهو أمر مثير للاهتمام للغاية. (أنا مبتدئ في JS ، ولم أتعرض أبدًا للوعود السابقة في البرية).
بادئ ذي بدء ، هذا الوعد الذي تم إرجاعه حديثًا ليس الوعد الأصلي ؛
ثانياً ، يرتبط التغيير في حالة الوعد الذي تم إرجاعه حديثًا (حل () أو رفض ().) بحالة الوعد السابق وكيف يتم استخدام ().
اشرح أولاً موقف ثم (): (الصيد متشابه)
var p1 = promise.resolve ("النجاح") ؛ var p2 = p1.then (task1) ؛ var p3 = p2.then (task2) ؛ملاحظة: Task1 و Task2 أعلاه هما كلا من عمليات الاسترجاعات.
هنا ، P1 هو وعد خلق وحل مباشرة () ؛
P2 هو وعد تم الحصول عليه مع ثم () ، و p3 هو أيضا وعد تم الحصول عليه مع ثم ().
فكيف تتغير حالة P2 ، وماذا عن P3؟
سأستخدم الرقم التالي لشرح هذا المفهوم:
في،
1. المثمن يمثل كائن الوعد.
2. تمثل الدائرة الحالة داخل وعد ، ويمثل السهم الأسود تغيير الحالة.
3. السهم الأيمن يمثل استدعاء الوظيفة ثم.
4. هذا ، طالما تسمى الوظيفة ثم ، سيتم إنشاء كائن وعد جديد.
5. عند استدعاء الوظيفة آنذاك ، لا تعرف ما هي حالة كائن الوعد السابق ، سواء كان معلقًا أو مستقرًا؟ لا يمكن افتراض هذا ولا يمكن رؤيته في الخارج.
6. لن تمنع دعوة الوظيفة ثم ، أي ، يتم إنشاء P2 و P3 على الفور تقريبًا ، حتى لو كان P1 لا يزال يهاجر ببطء عن حالته.
نحن نعلم أن حالة P1 تم حلها (انظر الكود أعلاه). ومع ذلك ، لم يتم شرحها هنا كيف تتغير حالات P2 و P3 ، هل تم حلها أو رفضها؟ انظر إلى الصورة الجديدة أدناه.
يمكنك رؤية المزيد من الماس.
يمثل الماس وظيفة رد الاتصال التي تم تمريرها عندما يتم استدعاء ذلك. يمثل المعين الصعودي عملية تمريرها [تم حلها لكائن الوعد السابق] ، ويمثل المعين الهبوطي عملية تمريرها [مرفوض لكائن الوعد السابق].
ملاحظة: في هذا المثال ، لا يتم تمرير أي معالجة للرفض ، أي أنه لا ينبغي رسم الماس الهبوطي في الصورة أعلاه. من أجل الراحة ، نحتاج فقط إلى معرفة أن الماس الصعودي والأسفل يرتبط بكيفية استخدامنا بعد ذلك أو التقاطه. لنلقي نظرة على رمز العينة مرة أخرى:
var p1 = promise.resolve ("النجاح") ؛ var p2 = p1.then (Task1) ؛ // يتم إنشاء Rhombus التصاعدي var p3 = p2.then (Task2) ؛يمكن ملاحظة أننا لا نعطي المعلمة الثانية من ذلك الوقت ، أي أننا لا نتعامل مع الرفض.
للإضافة ، إذا كنت ترغب في التعامل مع الرفض ، فيمكنك استخدامها أو التقاطها. يستخدم Catch خصيصًا للتعامل مع الرفض. بصرف النظر عن ذلك ، لا يوجد فرق بين ذلك الحين.
1. إذا تتم معالجة الحالة النهائية لـ P1 (حل أو رفض) بشكل صحيح (عند الاتصال بعد ذلك ، يتم تمرير رد الاتصال المقابل ، أي أن هناك ماسًا مقابلًا) ، فسيتم تغيير حالة P2 إلى حلها.
2. إذا لم تتم معالجة الحالة النهائية لـ P1 (حل أو رفض) بشكل صحيح (عند الاتصال بعد ذلك ، يكون رد الاتصال المقابل مفقودًا ، أي أنه لا يوجد الماس المقابل) ، فسيتم توجيه حالة P1 إلى P2 (حالة استلام P1).
3. تمرير مثل هذا.
4. لا تفسر هذه المقالة كيفية الحصول على آخر وعد البيانات النهائية في رد الاتصال ، أي كيفية تمرير البيانات ، هناك العديد من البرامج التعليمية.
3. فيما يلي بعض الأمثلة لتلخيص هذه المقالة.
في الشكل ، يتم إعطاء حالة P1 ، ويتم حلها أو رفضها من قبل نفسه. الهدف هو إطلاق الحالة النهائية لـ P2 و P3.
ما سبق أربعة أمثلة مستقلة ، مع عدم وجود صلة بينهما.
X تعني أن P3 لا يستخدم وظيفة Then أو Catch ، لذلك لا توجد طريقة للتعامل مع الدقة أو الرفض.
أخيرًا ، إذا كان هناك أي خطأ ، فالرجاء تصحيحني في الوقت المناسب ، شكرًا لك! ~! ! @~~~
المقالة أعلاه الفهم المتعمق لسلسلة وعد JS هو كل المحتوى الذي شاركته معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.