هل من الممكن إنشاء واستخدام كائن مؤجل مباشرة مع AJAX؟
-
21-12-2019 - |
سؤال
لدي تطبيق يرسل بعض طلبات 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()
.