"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل يمكننا إلغاء الوعود بالقوة في جافا سكريبت؟

هل يمكننا إلغاء الوعود بالقوة في جافا سكريبت؟

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

 Can We Forcefully Cancel Promises in JavaScript?

الوعود: هل يمكننا حقًا فرض الإلغاء؟

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

إذن، هل يمكننا إلغاء الوعد؟

في جافا سكريبت الحديثة، الحقيقة القاسية هي: لا. الوعود لا تدعم حاليًا الإلغاء.

ماذا يمكننا أن نفعل بدلاً من ذلك؟

نظرًا لأن إلغاء الوعد المباشر ليس خيارًا، فقد ظهرت طرق بديلة.

استخدام رمز الإلغاء

رمز الإلغاء هو آلية تسمح لك بتمرير متغير قابل للإلغاء إلى دالة. عند استدعاء الرمز المميز، فإنه يلغي العملية ويرفض الوعد المرتبط بها. إليك مثال:

function getWithCancel(url) { // token for cancellation
  var xhr = new XMLHttpRequest();
  xhr.open("GET", url);
  return new Promise(function(resolve, reject) {
    xhr.onload = function() { resolve(xhr.responseText); };
    token.cancel = function() {
      xhr.abort();
      reject(new Error("Cancelled"));
    };
    xhr.onerror = reject;
  });
}

بهذا الأسلوب، يمكنك:

var token = {};
var promise = getWithCancel("/someUrl", token);

// later on:
token.cancel();

استخدام مكتبة طرف ثالث

مكتبات واعدة، "عذرًا للتورية"، توفر مكتبات مثل Bluebird الدعم لإلغاء الوعد، إلى جانب ميزات متقدمة أخرى.

اعتماد نمط الاستدعاء الأخير

يضمن هذا النمط تنفيذ الاستدعاء الأخير فقط للوظيفة. يستخدم أسلوب رمزي لإلغاء الدعوات السابقة:

function last(fn) {
  var lastToken = { cancel: function(){} };
  return function() {
    lastToken.cancel();
    var args = Array.prototype.slice.call(arguments);
    args.push(lastToken);
    return fn.apply(this, args);
  };
}

الاستخدام:

var synced = last(getWithCancel);
synced("/url1?q=a"); // canceled
synced("/url1?q=ab"); // canceled
synced("/url1?q=abc"); // canceled
synced("/url1?q=abcd").then(function() {
  // only this will run
});

الاستنتاج

على الرغم من أنه من المخيب للآمال أن الوعود لا تدعم الإلغاء بطبيعتها، إلا أن التقنيات المذكورة أعلاه توفر حلولاً قابلة للتطبيق. مع تطور اللغة، قد يصبح إلغاء الوعد الحقيقي حقيقة في المستقبل.

أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3