"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > متى يتم تنفيذ معالجات JavaScript Promise .then() فيما يتعلق ببعضها البعض؟

متى يتم تنفيذ معالجات JavaScript Promise .then() فيما يتعلق ببعضها البعض؟

تم النشر بتاريخ 2024-12-11
تصفح:272

When do JavaScript Promise .then() Handlers Execute in Relation to Each Other?

فهم أمر التنفيذ في وعود جافا سكريبت

تقدم الوعود في جافا سكريبت نموذج برمجة غير متزامن حيث يتم تنفيذ التعليمات البرمجية بمجرد حدث معين، أو وعد ، يتم الوفاء. ومع ذلك، عند التعامل مع الوعود المتعددة، من الضروري فهم ترتيب التنفيذ لتجنب السلوك غير المتوقع.

ضع في اعتبارك مقتطف التعليمات البرمجية التالي:

Promise.resolve('A')
  .then(function(a){console.log(2, a); return 'B';})
  .then(function(a){
     Promise.resolve('C')
       .then(function(a){console.log(7, a);})
       .then(function(a){console.log(8, a);});
     console.log(3, a);
     return a;})
  .then(function(a){
     Promise.resolve('D')
       .then(function(a){console.log(9, a);})
       .then(function(a){console.log(10, a);});
     console.log(4, a);})
  .then(function(a){
     console.log(5, a);});
console.log(1);
setTimeout(function(){console.log(6)},0);

عند التنفيذ، يمكنك ملاحظة الترتيب التالي للإخراج:

1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6

فهم أمر التنفيذ

  1. حل الوعود بشكل غير متزامن: يتم حل الوعود بشكل مستقل عن سلسلة التنفيذ الحالية. هذا يعني أن معالجات .then() يتم استدعاؤها بشكل غير متزامن بعد انتهاء مؤشر الترابط الحالي.
  2. تنفيذ الوعود في قائمة الانتظار: تتم جدولة معالجات .then() للتشغيل بعد السابق يكتمل المعالج. لقد تم وضعها بشكل أساسي في قائمة الانتظار، ولهذا السبب ترى 1 و2 "أ" و3 "ب" مطبوعة بهذا الترتيب.
  3. الوعود الداخلية تنشئ سلاسل مستقلة: الوعود التي تم إنشاؤها ضمن معالجات .then() المتداخلة، مثل Promise.resolve('C') وPromise.resolve('D')، قم بإنشاء سلاسل وعد جديدة ومستقلة. هذه السلاسل الداخلية لا تتزامن بطبيعتها مع السلسلة الخارجية.
  4. ترتيب التنفيذ غير محدد: ترتيب التنفيذ لهذه السلاسل المستقلة غير مضمون. في هذه الحالة، يختار محرك الوعد تنفيذ معالجات ‎.then()‎ في السطرين 5 و12 قبل المعالجات الموجودة في السطرين 6 و7.

التوصيات

لضمان ترتيب معين للتنفيذ، تجنب إنشاء سلاسل وعود غير متزامنة واعتمد بدلاً من ذلك على ربط الوعود بطريقة تسلسلية. قم بإرجاع الوعود من معالجات .then() الداخلية لربطها بالوعد الأصلي، كما هو موضح أدناه:

Promise.resolve('A').then(function (a) { console.log(2, أ); إرجاع "ب" ؛ }).ثم (الوظيفة (أ) { فار p = Promise.resolve('C').then(function (a) { console.log(7, أ); }).ثم (الوظيفة (أ) { console.log(8, أ); }); console.log(3, أ); العودة ص؛ // ربط الوعد الداخلي بالسلسلة الأصلية }).ثم (الوظيفة (أ) { فار p = Promise.resolve('D').then(function (a) { console.log(9, أ); }).ثم (الوظيفة (أ) { console.log(10, أ); }); console.log(4, أ); العودة ص؛ // ربط الوعد الداخلي بالسلسلة الأصلية }).ثم (الوظيفة (أ) { console.log(5, أ); }); console.log(1); setTimeout(وظيفة () { console.log(6) }, 0);
Promise.resolve('A').then(function (a) {
    console.log(2, a);
    return 'B';
}).then(function (a) {
    var p = Promise.resolve('C').then(function (a) {
        console.log(7, a);
    }).then(function (a) {
        console.log(8, a);
    });
    console.log(3, a);
    return p; // Link the inner promise to the parent chain
}).then(function (a) {
    var p = Promise.resolve('D').then(function (a) {
        console.log(9, a);
    }).then(function (a) {
        console.log(10, a);
    });
    console.log(4, a);
    return p; // Link the inner promise to the parent chain
}).then(function (a) {
    console.log(5, a);
});

console.log(1);

setTimeout(function () {
    console.log(6)
}, 0);
مع هذا النهج، يصبح أمر التنفيذ حتميًا تمامًا: 1، 2 "A"، 3 "B"، 7 "C"، 8 غير محدد، 4 غير محدد، 9 "D"، 10 غير محدد، 5 غير محدد، و6.

بيان الافراج أعيد طبع هذه المقالة على: 1729739979 في حالة وجود أي انتهاك، يرجى الاتصال بـ [email protected] لحذفها
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3