jQuery 3.3

jQuery.when()




jquery

jQuery.when (deferreds) الإرجاع: Promise

الوصف: يوفر طريقة لتنفيذ وظائف رد الاتصال استنادًا إلى صفر أو أكثر من كائنات قابلة للتنفيذ ، وعادة ما تكون الكائنات Deferred التي تمثل الأحداث غير المتزامنة.

إذا لم يتم تمرير أية وسائط إلى jQuery.when() ، jQuery.when() إلى "وعد" تمت تسويته.

إذا تم تمرير واحد مؤجل إلى jQuery.when() ، يتم إرجاع الكائن Promise (مجموعة فرعية من أساليب مؤجلة) بواسطة الأسلوب. يمكن استدعاء أساليب إضافية من الكائن Promation لإرفاق عمليات الرد ، مثل deferred.then . عندما يتم حل أو رفض Deferred ، عادة عن طريق الرمز الذي أنشأ المؤجل في الأصل ، سيتم استدعاء الاستدعاءات المناسبة. على سبيل المثال ، الكائن jqXHR الذي يتم إرجاعه بواسطة jQuery.ajax() هو كائن متوافق مع Promise ويمكن استخدامه بهذه الطريقة:

$.when( $.ajax( "test.aspx" ) ).then(function( data, textStatus, jqXHR ) {
  alert( jqXHR.status ); // Alerts 200
});

إذا تم تمرير وسيطة واحدة إلى jQuery.when() وهي ليست مؤجلة أو jQuery.when() ، فسوف يتم التعامل معها على أنها حسم مؤجل وسيتم تنفيذ أية عمليات تعليق متصلة على الفور. يتم تمرير doneCallbacks في الوسيطة الأصلية. في هذه الحالة ، لا يتم أبدًا استدعاء أي failCallbacks قد تعيّنه ، نظرًا لعدم رفض Deferred أبدًا. فمثلا:

$.when( { testing: 123 } ).done(function( x ) {
  alert( x.testing ); // Alerts "123"
});

إذا لم تقم jQuery.when() أي حجج على الإطلاق ، jQuery.when() إلى الوعد jQuery.when() .

$.when().then(function( x ) {
  alert( "I fired immediately" );
});

في الحالة التي يتم فيها تمرير كائنات مؤجلة متعددة إلى jQuery.when() ، ترجع الطريقة الوعد من كائن مؤجل "رئيسي" جديد يتتبع الحالة التجميعية لكل الإقرارات التي تم تمريرها. ستقوم الطريقة بحل سيدها المؤجل حالما يتم حل جميع المؤجلات ، أو رفض المؤجل الرئيسي بمجرد رفض أحد العقود المؤجلة. إذا تم حل سيد Deferred ، يتم تنفيذ doneCallbacks للسيد المؤجل. تقدم الحجج التي تم تمريرها إلى doneCallbacks القيم التي تم حلها لكل من Deferreds ، jQuery.when() الترتيب الذي تم تمرير jQuery.when() إلى jQuery.when() . فمثلا:

var d1 = $.Deferred();
var d2 = $.Deferred();
 
$.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
});
 
d1.resolve( "Fish" );
d2.resolve( "Pizza" );

في حال تم حل Deferred بدون قيمة ، فسيتم إلغاء وسيطة doneCallback المقابلة. إذا قام المؤجر بحل قيمة واحدة ، فستحتفظ الوسيطة المقابلة بتلك القيمة. في الحالة التي تكون فيها القيمة المؤجلة التي تم حلها للعديد من القيم ، تكون الوسيطة المقابلة عبارة عن مصفوفة لتلك القيم. فمثلا:

var d1 = $.Deferred();
var d2 = $.Deferred();
var d3 = $.Deferred();
 
$.when( d1, d2, d3 ).done(function ( v1, v2, v3 ) {
    console.log( v1 ); // v1 is undefined
    console.log( v2 ); // v2 is "abc"
    console.log( v3 ); // v3 is an array [ 1, 2, 3, 4, 5 ]
});
 
d1.resolve();
d2.resolve( "abc" );
d3.resolve( 1, 2, 3, 4, 5 );

في حالة Deferreds متعددة حيث يتم رفض أحد Deferreds ، jQuery.when() الفور بإشعال failCallbacks الخاصة به سيد مؤجل. لاحظ أن بعض العقود المؤجلة قد لا تزال بدون حل عند هذه النقطة. تتطابق الوسيطات التي تم تمريرها إلى failCallbacks مع توقيع failCallback لـ Deferred الذي تم رفضه. إذا كنت بحاجة إلى إجراء معالجة إضافية لهذه الحالة ، مثل إلغاء أي طلبات غير مكتملة من Ajax ، فيمكنك الاحتفاظ بالمراجع إلى كائنات jqXHR الأساسية في الإغلاق وفحصها / إلغائها في failCallback.

أمثلة:

تنفيذ وظيفة بعد نجاح طلبان Ajax. (راجع وثائق jQuery.ajax () للحصول على وصف كامل لحالات النجاح والخطأ لطلب AJAX).

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) {
  // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
  // Each argument is an array with the following structure: [ data, statusText, jqXHR ]
  var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
  if ( /Whip It/.test( data ) ) {
    alert( "We got what we came for!" );
  }
});

تنفيذ وظيفة myFunc عندما تكون كل طلبات ajax ناجحة ، أو myFailure إذا كان أحدهما يحتوي على خطأ.

$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) )
  .then( myFunc, myFailure );