بناء الجملة لمسج.المؤجلة ، مما يجعل وظيفة متزامن وعد العودة

StackOverflow https://stackoverflow.com//questions/10664466

سؤال

سؤال سريع حول كيفية استخدام مسج.مؤجلة لجعل وظيفة متزامنة بطيئة إرجاع وعد بدلا من ذلك.ما فعلته حتى الآن هو هذا :

function sayIt(ms) {
    setTimeout( function() { console.log('what I say'); }, ms);
} 

function doIt() {
    return $.Deferred( function() { sayIt(2000); }).promise();
}


doIt().then( function() { console.log('ah'); });

و سايت (2000) يمر دائما ولكن وظيفة بالسلاسل بعد 'ثم' أبدا الحرائق.

إذا فعلت هذا :

doIt().then( console.log('ah'));

يأتي ' آه 'على الفور ، ثم' ما أقوله ' بعد 2000 مللي ثانية-ما أريده هو عكس ذلك بالطبع-أنه بعد ثانيتين أحصل على 'ما أقوله' ثم 'آه' بعد ذلك مباشرة.

أي اقتراحات تقدير!

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

المحلول

للقيام بشيء متزامن، ولكن لا يزال يستخدم وعد، افعل: giveacodicetagpre.

التأثير هو أنك لا تزال تحصل على وعد، ولكن هذا الوعد قد حل بالفعل، لذلك أي godhodicetagcode الذي يتم تسجيله لاحقا على ذلك على الفور.

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

نصائح أخرى

إذا كنت ترغب في تنفيذ وظيفة بعد انتهاء المهلة ، فأنت بحاجة إلى الاتصال resolve() على ال Deferred كائن من داخل وظيفة انتهاء المهلة:

function sayIt(ms) {
  var d = $.Deferred();
  setTimeout(function() {
      console.log('what I say');
      d.resolve()
    }, ms);
  return d;
}

وبهذه الطريقة يمكنك تقييد القرار من Deferred الاعتراض على انتهاء المهلة.

لتحقيق ما أعتقد هو القصد الخاص بك:

function doIt() {
  return sayIt(2000).promise()
}

ال .promise() المكالمة اختيارية.إنه يقيد فقط الواجهة المتاحة للمتصلين:عن طريق العودة أ Promise بدلا من الأصل Deferred الكائن ، يمكن للمتصل أن يتفاعل فقط مع الأحداث ، ولكن لا يؤدي إلى تشغيلها.المرجع: http://api.jquery.com/deferred.promise/.

في النهاية, مكالمتك الأصلية:

doIt().then( function() { console.log('ah'); });

سوف الإخراج:

// 2 seconds delay
what I say
ah 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top