سؤال

كنت أجري بحثًا عن الوعود في 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 وعد وطني.والعكس يعمل.

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