jQuery.when( deferreds )
jQuery.when( deferreds )
jQuery.when, הוא מוחזר על ידי שיטה ושיטות נוספות של אובייקט נדחה ויכול להפעיל קריאה חוזרת המצורפת, כמו defered.then. כאשר אובייקט נדחה פתור או בוטל, בדרך כלל על ידי קוד שיצר אובייקט הנדחה בהתחלה, פונקציות המתאימות של קריאה חוזרת יופעלו. לדוגמה, אובייקט jqXHR, שהוחזר באמצעות jQuery.ajax הוא אובייקט נדחה וניתן להשתמש בו בצורה הבאה:jQuery.when והוא לא אובייקט נדחה, הוא יטופל כי אובייקט נדחה פתור וכל doneCallbacks (פונקציות קריאה חוזרת מוצלחות) מצורפות יופעלו מייד. doneCallbacks שולחות ארגומנט מקורי. במקרה הזה כל failCallbacks (פונקציות קריאה חוזרת נכשלות), שאתם יכולים להגדיר, לא יופעלו אף פעם, מכיוון שאובייקט נדחה לא יבוטל. לדוגמה:
$.when( { testing: 123 } ).done(
function(x){ alert(x.testing); } /* alerts "123" */
);
במקרה שמספר אובייקטים הנדחים נשלחים ל jQuery.when, שיטה מחזירה אובייקט נדחה "אב" החדש, שעוקב על מצב של כל אובייקטים הנדחים, שהוא מקבל. שיטה פותרת אובייקט אב הנדחה, ברגע שכל הנדחים פתורים, או מבטל אובייקט אב הנדחה ברגע שאחד מהנדחים בוטל. אם אובייקט נדחה יהיה פתור, הוא מעביר ערכים פתורים של כל הנדחים, שנשלחו ל jQuery.when. לדוגמה, כאשר נדחה מבצע בקשות של jQuery.ajax(), בתור הארגומנטים יהיו אובייקטים של jqXHR עבור הבקשות, לפי הסדר שהם נמצאים ברשימת הארגומנטים.
במקרה של אובייקטים נדחים מרובים, כאשר אחד מהנדחים בוטל, jQuery.when מייד מפעיל failCallbacks עבור אובייקט אב נדחה שלו. שימו לב שחלק מהנדחים עשוים עדיין להיות לא פתורים ברגע הזה. אם אתם צריכים לבצע עיבוד נוסף במקרה זה, כגון ביטול כל בקשות AJAX הלא גמורות, אתם יכולים לשמור קישורים לאובייקטים בסיסים של jqXHR ולבדוק/לבטל אותם ב failCallback.
דוגמאות
דוגמה 1
מפעיל פונקציה אחרי שתי בקשות המוצלחות של 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 */ var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */ if ( /Whip It/.test(jqXHR.responseText) ) { alert("First page has 'Whip It' somewhere."); } });

