تعمل طريقة ECMAScript Promise.all مع jQuery.Deferred.لماذا؟
-
22-12-2019 - |
سؤال
كنت أجري بحثًا عن الوعود في JavaScript.كنت مهتمًا هل يمكنني دمج وعود ECMAScript مع تطبيقات أخرى، على سبيل المثال jQuery $.Deferred
.وفوجئت عندما Promises.all
يعمل بشكل جيد مع مسج $.Deferred
.أحاول العثور على الإجابة في كود مصدر jQuery ومواصفات CommonJS Promises/A، لكنني ما زلت أسيء فهم سبب عمل هذا الرمز كما توقعت (افعل console.log
بعد 10 ثواني وليس 5 ثواني):
var promise = new Promise(function (resolve, reject) {
setTimeout(function () {
resolve();//resolve first promise after 5 secs
console.log('Promise resolved');
}, 5000);
});
var deferred = $.Deferred();
setTimeout(function () {
deferred.resolve();//resolve after 10 seconds
console.log('Deferred resolved');
}, 10000);
Promise.all([promise,deferred]).then(function () {
console.log('All is done');//log after 10 seconds
});
هل لديك أي أفكار؟
Promise.all
يجب أن تعتمد على شيء ما أو طريقة ما $.Deferred
لفهم يتم حلها أم لا.ما هو هذا الأسلوب/المجال؟
المحلول
تم تصميم مواصفات الوعود A+ (التي استندت إليها مواصفات فك الوعود بناءً على استخدام الوعود الأصلية) خصيصًا للقيام بذلك.
بهدف تصميم المكتبات التي تعمل بشكل جيد، يتم بناء المواصفات حول طريقة واحدة: .then
.
تحدد الطريقةthen كيفية عمل استمرار الوعد.فضح وعود jQuery .then
منذ الإصدار 1.8 مما يعني أنهم يحاولون المشاركة في هذه اللعبة.بينما يتم تأجيل jQuery والوعود لا الوعود/وعود A+ - تحاول أن تكون وعودًا/وعودًا مما يعني ما يلي:
return Promise.resolve($.get(...))
سوف تعمل دائما.سوف تستوعب كل الوعود A+ (والوعود الأصلية). .then
قادرة بشكل متكرر وحل مع قيمتها عند إعادتها.
Promise.resolve({then:function(fn){ return fn(3); }}).then(function(el){
console.log(el); // this logs 3
})
إذا تحققنا من تخصيص ، نستطيع ان نرى:
يترك نتيجة يتم الاستدعاء(nextPromise,
"then"
, (ResolveElement, الوعد القدرة.[[يرفض]])).
(يتعلق أيضًا هذا)
الذي يدعو .then
ويحل العنصر التالي عند ذلك .then
قادرة على حل
يستخدم المؤجل في jQuery تنفيذًا غير قياسي للوعد، لذا لا يمكنه استهلاك الوعود الأصلية (أي أنه لا يمكنك توقع ذلك $.when
وعد وطني.والعكس يعمل.