מה עוד אפשר לעשות עם JavaScript Promise?
לאחר שקראנו על הבסיס שבשימוש עם JavaScript Promise בחלק א׳, בחלק זה נעסוק בחלקים הנוספים הנגישים לנו ב- API שלו כדוגמת race שעוזר לנו לבצע מעין ״מירוץ״ בין כמה Promises וברגע שאחד מהם מחזיר תשובה להתקדם להמשך הקוד מבלי לחכות לנוספים.
Promise.all()
פונקציה המקבלת מערך של Promises כמשתנה ובעצם מחזירה Promise יחיד שמה שחוזר ממנו הוא מערך עם התוצאות מה- Promises שהעברנו.
הצלחה
כאשר כל ה- Promises בתוך המערך שהועבר חזרו בהצלחה או במידה והמערך כלל איברים שאינם Promise אז נקבל תשובה אסינכרונית עם התוצאות של כל אחד מהאיברים במערך.
const alreadyResolvedPromise = Promise.resolve(1);
const justNumber = 1337;
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 500);
});
Promise.all([alreadyResolvedPromise, justNumber, promise]).then(result => {
console.log(result); // [1, 1337, "foo"]
});
כישלון
כאשר אחד מהאיברים שהועברו נכשל נקבל תשובה המכילה את התוצאה של אותו Promise שנכשל, ללא קשר אם שאר האיברים עברו בהצלחה.
Promise.all([Promise.resolve(1), Promise.reject(‘Some error message’)])).catch(result => {
console.log(result); // ‘Some error message’
});
Promise.race()
פונקציה המקבלת מערך של Promises כמשתנה ומחזירה תשובה של הצלחה או כישלון ברגע שאחד מה- Promises במערך חזר, לא משנה אם הוא הצליח או נכשל.
const p1 = new Promise((resolve, reject) => setTimeout(() => resolve('foo'), 500));
const p2 = new Promise((resolve, reject) => setTimeout(() => resolve('bar'), 100));
Promise.race([p1, p2]).then(result => {
console.log(result); // "bar"
// the second promise is faster than the first one, this is why we are getting a successful response
});
כאשר אחד מהאיברים במערך נכשל
const p1 = new Promise((resolve, reject) => setTimeout(() => resolve('foo'), 500));
const p2 = new Promise((resolve, reject) => setTimeout(() => reject('bar'), 100));
Promise.race([p1, p2]).then((result) => {
console.log(result);
}).catch((error) => {
// the second promise is faster than the first one, this is why we are getting a rejection
console.log('error is:', error); // "error is: bar"
});
Promise.allSettled()
פונקציה המקבלת מערך של Promises כמשתנה ומחזירה תשובה כשכל ה- Promises סיימו, לא משנה אם בהצלחה או כישלון, התשובה תכלול מערך שמתאר את התוצאה של כל אחד מה- Promises.
const p1 = Promise.resolve(1);
const p2 = Promise.reject('Some error message');
Promise.allSettled([p1, p2]).then(result => {
console.log(result); // [{status:"fulfilled", value:1}, {status:"rejected", reason:"Some error message"}]
});