Галоўная > 8 статычных метадаў класа Promise. Розніца паміж імі. Як выкарыстоўваць.

8 статычных метадаў класа Promise. Розніца паміж імі. Як выкарыстоўваць.

js

Статычныя метады класа Promise:

  1. Promise.all(iterable)
  2. Promise.allSettled(iterable)
  3. Promise.race(iterable)
  4. Promise.any(iterable)
  5. Promise.resolve(value)
  6. Promise.reject(reason)
  7. Promise.withResolvers()
  8. Promise.try()

1. Promise.all(iterable) Атрымлівае на уваход масіў промісаў, вяртае адзін проміс, які ўтрымлівае:

а) масіў паспяхова выкананых промісаў (у выпадку, калі ўсе яны завяршыліліся паспяхова):

text
1const 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"]

б) проміс з памылкай (калі хоць адзін з іх завяршыўся з памылкай). Ужо паспяхова выкананыя дагэтуль промісы будуць праігнараваныя.

text
1const 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
  1. Promise.allSettled(iterable)

Прымае масіў промісаў і вяртае проміс з масівам адказаў на кожны з перададзеных промісаў.

Для паспяхова выкананага проміса вернецца адказ у выглядзе:

{status: fulfilled, value: <your_value>}

Для проміса з памылкай:

{status: rejected, reason: <error_message>}

text
1Promise.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// ]
  1. Promise.race(iterable)

Прымае масіў промісаў, вяртае проміс з першым выкананым промісам (няма разніцы - паспяховым, ці з памылкай) з перададзеных промісаў.

text
1const 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"
text
1const 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"
  1. Promise.any(iterable)

Прымае масіў промісаў, вяртае проміс:

а) з першым паспяхова выкананым промісам

text
1const 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"

б) з масівам адказаў няўдала выкананых промісаў, калі ўсе яны завяршыліся няўдала:

text
1const 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// }
  1. Promise.resolve(value)

Статычны метад, які паспяхова завяршае promise. Калі перадаецца нейкае значэнне, то яго можна атрымаць праз .then

text
1const promise1 = Promise.resolve(123);
2
3promise1.then((value) => {
4  console.log(value);
5  // Expected output: 123
6});
  1. Promise.reject(reason)

Статычны метад, які завяршае promise з памылкай. Памылку можна атрымаць праз .catch

text
1function 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
  1. Promise.withResolvers() (2024)

Вяртае instance ад new Promise і 2 функцыі - resolve і reject:

text
1const { promise, resolve, reject } = Promise.withResolvers();

Дазваляе выкарыстоўваць больш лаканічны сінтаксіс, чым звычайны new Promise(). Больш зразумела гэта будзе на прыкладах.

text
1// Код без выкарыстоўвання 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  });
text
1// Код з выкарыстаннем 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  });
  1. Promise.try(func, arg1, arg2) (2025)

Статычны метад Promise.try() прымае любы callback (з return, альбо throw, сінхронны альбо асінхронны) і абгортвае яго вынік у promise. Гэты проміс:

  • Заўжды паспяхова выкананы (fullfilled), калі сінхронны callback вяртае value.
  • Заўжды выкананы з памылкай (rejected), калі сінхронны callback выкідвае выключэнне (throw).
  • Выконваецца асінхронна паспяхова (fullfilled), ці з памылкай (rejected), калі callback утрымлівае promise.

У выніку маем больш лаканічны сінтаксіс:

text
1// замест
2new Promise((resolve) => resolve(func()));
3
4//маем
5Promise.try(func);

func у прыкладзе выконваецца сінхронна. То бок, не з'яўляецца эквівалентам наступнага кода:

text
1Promise.resolve().then(func);

Вось яшчэ прыклад выкарыстоўвання:

text
1function 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});

Спадзяюся, каму-небудзь гэтая інфармацыя будзе карыснай! Стаўце падабайкі, пішыце каментары!

З выкарастанай літэратуры:

LoveJS, 2025-03-09
Каментары

    (Каб даслаць каментар залагуйцеся ў свой уліковы запіс)