8 статычных метадаў класа Promise. Розніца паміж імі. Як выкарыстоўваць.
Статычныя метады класа Promise:
- Promise.all(iterable)
- Promise.allSettled(iterable)
- Promise.race(iterable)
- Promise.any(iterable)
- Promise.resolve(value)
- Promise.reject(reason)
- Promise.withResolvers()
- Promise.try()
1. Promise.all(iterable) Атрымлівае на уваход масіў промісаў, вяртае адзін проміс, які ўтрымлівае:
а) масіў паспяхова выкананых промісаў (у выпадку, калі ўсе яны завяршыліліся паспяхова):
text1const promise1 = Promise.resolve(3); 2const promise2 = 42; 3const promise3 = new Promise((resolve, reject) => { 4 setTimeout(resolve, 100, "foo"); 5}); 6 7Promise.all([promise1, promise2, promise3]).then((values) => { 8 console.log(values); 9}); 10// Expected output: Array [3, 42, "foo"]
б) проміс з памылкай (калі хоць адзін з іх завяршыўся з памылкай). Ужо паспяхова выкананыя дагэтуль промісы будуць праігнараваныя.
text1const promise1 = 42; 2const promise2 = Promise.reject(3); 3const promise3 = new Promise((resolve, reject) => { 4 setTimeout(resolve, 100, "foo"); 5}); 6 7Promise.all([promise1, promise2, promise3]).catch(err => console.log(err)); 8// Expected output: 3
- Promise.allSettled(iterable)
Прымае масіў промісаў і вяртае проміс з масівам адказаў на кожны з перададзеных промісаў.
Для паспяхова выкананага проміса вернецца адказ у выглядзе:
{status: fulfilled, value: <your_value>}
Для проміса з памылкай:
{status: rejected, reason: <error_message>}
text1Promise.allSettled([ 2 Promise.resolve(33), 3 new Promise((resolve) => setTimeout(() => resolve(66), 0)), 4 99, 5 Promise.reject(new Error("an error")), 6]).then((values) => console.log(values)); 7 8// [ 9// { status: 'fulfilled', value: 33 }, 10// { status: 'fulfilled', value: 66 }, 11// { status: 'fulfilled', value: 99 }, 12// { status: 'rejected', reason: Error: an error } 13// ]
- Promise.race(iterable)
Прымае масіў промісаў, вяртае проміс з першым выкананым промісам (няма разніцы - паспяховым, ці з памылкай) з перададзеных промісаў.
text1const promise1 = new Promise((resolve, reject) => { 2 setTimeout(resolve, 500, "one"); 3}); 4 5const promise2 = new Promise((resolve, reject) => { 6 setTimeout(resolve, 100, "two"); 7}); 8 9Promise.race([promise1, promise2]).then((value) => { 10 console.log(value); 11 // паспяховы promise2 выканаецца першым 12}); 13// Expected output: "two"
text1const promise1 = new Promise((resolve, reject) => { 2 setTimeout(resolve, 500, "one"); 3}); 4 5const promise2 = new Promise((resolve, reject) => { 6 setTimeout(reject, 100, "two"); 7}); 8 9Promise.race([promise1, promise2]).catch((err) => { 10 console.log(err); 11 // promise2 з памылкай выканаецца першым 12}); 13// Expected output: "two"
- Promise.any(iterable)
Прымае масіў промісаў, вяртае проміс:
а) з першым паспяхова выкананым промісам
text1const promise1 = Promise.reject(0); 2const promise2 = new Promise((resolve) => setTimeout(resolve, 100, "quick")); 3const promise3 = new Promise((resolve, reject) => setTimeout(reject, 500, "slow")); 4 5const promises = [promise1, promise2, promise3]; 6 7Promise.any(promises) 8.then((value) => console.log('value', value)) 9.catch((err) => console.log('error', err)); 10 11// Expected output: "quick"
б) з масівам адказаў няўдала выкананых промісаў, калі ўсе яны завяршыліся няўдала:
text1const promise1 = Promise.reject(0); 2const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, "quick")); 3const promise3 = new Promise((resolve, reject) => setTimeout(reject, 500, "slow")); 4 5const promises = [promise1, promise2, promise3]; 6 7Promise.any(promises) 8.then((value) => console.log('value', value)) 9.catch((err) => console.log('error', err)); 10 11// Expected output: error [AggregateError: All promises were rejected] { 12// [errors]: [ 0, 'quick', 'slow' ] 13// }
- Promise.resolve(value)
Статычны метад, які паспяхова завяршае promise. Калі перадаецца нейкае значэнне, то яго можна атрымаць праз .then
text1const promise1 = Promise.resolve(123); 2 3promise1.then((value) => { 4 console.log(value); 5 // Expected output: 123 6});
- Promise.reject(reason)
Статычны метад, які завяршае promise з памылкай. Памылку можна атрымаць праз .catch
text1function resolved(result) { 2 console.log("Resolved"); 3} 4 5function rejected(result) { 6 console.error(result); 7} 8 9Promise.reject(new Error("fail")).then(resolved, rejected); 10// Expected output: Error: fail
- Promise.withResolvers() (2024)
Вяртае instance ад new Promise і 2 функцыі - resolve і reject:
text1const { promise, resolve, reject } = Promise.withResolvers();
Дазваляе выкарыстоўваць больш лаканічны сінтаксіс, чым звычайны new Promise(). Больш зразумела гэта будзе на прыкладах.
text1// Код без выкарыстоўвання Promise.withResolvers() 2 3let outerResolve; 4let outerReject; 5 6const promise = new Promise((resolve, reject) => { 7 outerResolve = resolve; 8 outerReject = reject; 9}); 10 11// Settled from _outside_ the promise! 12setTimeout(() => { 13 if (Math.random() < 0.5) { 14 outerResolve("Resolved!") 15 } else { 16 outerReject("Rejected!"); 17 } 18}, 1000); 19 20promise 21 .then((resolvedValue) => { 22 console.log(resolvedValue); 23 }) 24 .catch((rejectedValue) => { 25 console.error(rejectedValue); 26 });
text1// Код з выкарыстаннем Promise.withResolvers() 2 3const { promise, resolve, reject } = Promise.withResolvers(); 4 5setTimeout(() => { 6 if (Math.random() < 0.5) { 7 resolve('Resolved!'); 8 } else { 9 reject('Rejected!'); 10 } 11}, 1000); 12 13promise 14 .then((resolvedValue) => { 15 console.log(resolvedValue); 16 }) 17 .catch((rejectedValue) => { 18 console.error(rejectedValue); 19 });
- Promise.try(func, arg1, arg2) (2025)
Статычны метад Promise.try() прымае любы callback (з return, альбо throw, сінхронны альбо асінхронны) і абгортвае яго вынік у promise. Гэты проміс:
- Заўжды паспяхова выкананы (fullfilled), калі сінхронны callback вяртае value.
- Заўжды выкананы з памылкай (rejected), калі сінхронны callback выкідвае выключэнне (throw).
- Выконваецца асінхронна паспяхова (fullfilled), ці з памылкай (rejected), калі callback утрымлівае promise.
У выніку маем больш лаканічны сінтаксіс:
text1// замест 2new Promise((resolve) => resolve(func())); 3 4//маем 5Promise.try(func);
func у прыкладзе выконваецца сінхронна. То бок, не з'яўляецца эквівалентам наступнага кода:
text1Promise.resolve().then(func);
Вось яшчэ прыклад выкарыстоўвання:
text1function doSomething(action) { 2 return Promise.try(action) 3 .then((result) => console.log(result)) 4 .catch((error) => console.error(error)) 5 .finally(() => console.log("Done")); 6} 7 8doSomething(() => "Sync result"); 9 10doSomething(() => { 11 throw new Error("Sync error"); 12}); 13 14doSomething(async () => "Async result"); 15 16doSomething(async () => { 17 throw new Error("Async error"); 18});
Спадзяюся, каму-небудзь гэтая інфармацыя будзе карыснай! Стаўце падабайкі, пішыце каментары!
З выкарастанай літэратуры:
Каментары
(Каб даслаць каментар залагуйцеся ў свой уліковы запіс)