سؤال

لدي تطبيق يرسل بعض طلبات AJAX عندما ينقر المستخدم على زر معين.

ومع ذلك، لدي أيضًا شيء مشابه لزر "إلغاء"، والذي من المفترض أن يلغي جميع الطلبات.

أنا استخدم $.when حاليًا للتعامل مع جميع الطلبات المرسلة، مع إضافة عمليات رد الاتصال المناسبة إلى ملف Promise الكائن الذي يعود.

ومع ذلك، حقيقة أن $.when يعود أ Promise الكائن محبط، لأنه لا يتضمن (عمدًا) الأساليب Deferred يجب التحكم بالطلبات كما هو موضح بهذا الكود:

باستخدام $.when

var x = $.when($.get('/'), $.get('/')); // .then(function() {console.log('done');});

Object.keys(x); 
// ["state", "always", "then", "promise", "pipe", "done", "fail", "progress"]

استخدام طلب AJAX واحد (ينفذ jqXHR الواجهة المؤجلة)

var x = $.get('/');

Object.keys(x); 
// ["readyState", "getResponseHeader", "getAllResponseHeaders", "setRequestHeader", "overrideMimeType", "statusCode", "abort", "state", "always", "then", "promise", "pipe", "done", "fail", "progress", "complete", "success", "error"]

أبحث عن طريقة لاسترجاع Deferred كائن، أو استبدال $.when باستخدام الطريقة التي تؤدي نفس الشيء، ولكنها ترجع a Deferred كائن بدلا من ذلك.ومن هناك، سأتمكن من استدعاء طريقة الرفض/الإجهاض المناسبة.

هل هذا ممكن؟

هل كانت مفيدة؟

المحلول

يمكنك وضع الطلبات في مصفوفة وإحباطها بشكل فردي عندما تحتاج إلى ذلك.

لهذا يمكنك استخدام .apply على $.when.على سبيل المثال:

var requests = [$.get('/'), $.get('/')];
$.when.apply($,requests).then(function(res1,res2){
      //access results here
});

// aborting:
requests.forEach(function(x){ return x.abort();});

تُستخدم الكائنات المؤجلة فقط لإنشاء وعود من واجهات برمجة تطبيقات رد الاتصال.لا يمكنك "استرجاع" الشيء المؤجل لوعد موجود بالفعل.قم بإنشاء أخرى جديدة فقط باستخدامه.

قد ترغب أيضًا في إلقاء نظرة على Domenic's last().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top