РклаÑÑе Promise еÑÑÑ 6 ÑÑаÑиÑеÑкиÑ
меÑодов. ÐавайÑе познакомимÑÑ Ñ Ð½Ð¸Ð¼Ð¸.
Promise.all
ÐопÑÑÑим, нам нÑжно запÑÑÑиÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво пÑомиÑов паÑаллелÑно и дождаÑÑÑÑ, пока вÑе они вÑполнÑÑÑÑ.
ÐапÑимеÑ, паÑаллелÑно загÑÑзиÑÑ Ð½ÐµÑколÑко Ñайлов и обÑабоÑаÑÑ ÑезÑлÑÑаÑ, когда он гоÑов.
ÐÐ»Ñ ÑÑого как Ñаз и пÑигодиÑÑÑ Promise.all.
СинÑакÑиÑ:
let promise = Promise.all(iterable);
ÐеÑод Promise.all пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¼Ð°ÑÑив пÑомиÑов (Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð»Ñбой пеÑебиÑаемÑй обÑекÑ, но обÑÑно иÑполÑзÑеÑÑÑ Ð¼Ð°ÑÑив) и возвÑаÑÐ°ÐµÑ Ð½Ð¾Ð²Ñй пÑомиÑ.
ÐовÑй пÑÐ¾Ð¼Ð¸Ñ Ð·Ð°Ð²ÐµÑÑиÑÑÑ, когда завеÑÑиÑÑÑ Ð²ÐµÑÑ Ð¿ÐµÑеданнÑй ÑпиÑок пÑомиÑов, и его ÑезÑлÑÑаÑом бÑÐ´ÐµÑ Ð¼Ð°ÑÑив Ð¸Ñ ÑезÑлÑÑаÑов.
ÐапÑимеÑ, Promise.all, пÑедÑÑавленнÑй ниже, вÑполниÑÑÑ ÑпÑÑÑÑ 3 ÑекÑндÑ, его ÑезÑлÑÑаÑом бÑÐ´ÐµÑ Ð¼Ð°ÑÑив [1, 2, 3]:
Promise.all([
new Promise(resolve => setTimeout(() => resolve(1), 3000)), // 1
new Promise(resolve => setTimeout(() => resolve(2), 2000)), // 2
new Promise(resolve => setTimeout(() => resolve(3), 1000)) // 3
]).then(alert); // когда вÑе пÑомиÑÑ Ð²ÑполнÑÑÑÑ, ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ 1,2,3
// каждÑй пÑÐ¾Ð¼Ð¸Ñ Ð´Ð°ÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива
ÐбÑаÑиÑе внимание, ÑÑо поÑÑдок ÑлеменÑов маÑÑива в ÑоÑноÑÑи ÑооÑвеÑÑÑвÑÐµÑ Ð¿Ð¾ÑÑÐ´ÐºÑ Ð¸ÑÑ Ð¾Ð´Ð½ÑÑ Ð¿ÑомиÑов. Ðаже еÑли пеÑвÑй пÑÐ¾Ð¼Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð´Ð¾Ð»ÑÑе вÑÐµÑ , его ÑезÑлÑÑÐ°Ñ Ð²ÑÑ Ñавно бÑÐ´ÐµÑ Ð¿ÐµÑвÑм в маÑÑиве.
ЧаÑÑо пÑименÑемÑй ÑÑÑк â пÑопÑÑÑиÑÑ Ð¼Ð°ÑÑив даннÑÑ
ÑеÑез map-ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа ÑоздаÑÑ Ð·Ð°Ð´Ð°ÑÑ-пÑомиÑ, и заÑем обеÑнÑÑÑ Ð¿Ð¾Ð»ÑÑивÑийÑÑ Ð¼Ð°ÑÑив в Promise.all.
ÐапÑимеÑ, еÑли Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¼Ð°ÑÑив ÑÑÑлок, Ñо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ загÑÑзиÑÑ Ð¸Ñ Ð²Ð¾Ñ Ñак:
let urls = [
'https://api.github.com/users/iliakan',
'https://api.github.com/users/remy',
'https://api.github.com/users/jeresig'
];
// ÐÑеобÑазÑем каждÑй URL в пÑомиÑ, возвÑаÑÑннÑй fetch
let requests = urls.map(url => fetch(url));
// Promise.all бÑÐ´ÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑеÑ
пÑомиÑов
Promise.all(requests)
.then(responses => responses.forEach(
response => alert(`${response.url}: ${response.status}`)
));
Ð Ð²Ð¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¿Ð¾Ð±Ð¾Ð»ÑÑе, Ñ Ð¿Ð¾Ð»ÑÑением инÑоÑмаÑии о полÑзоваÑелÑÑ GitHub по Ð¸Ñ Ð»Ð¾Ð³Ð¸Ð½Ð°Ð¼ из маÑÑива (Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð¿Ð¾Ð»ÑÑаÑÑ Ð¼Ð°ÑÑив ÑоваÑов по Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑам, логика Ñа же):
let names = ['iliakan', 'remy', 'jeresig'];
let requests = names.map(name => fetch(`https://api.github.com/users/${name}`));
Promise.all(requests)
.then(responses => {
// вÑе пÑомиÑÑ ÑÑпеÑно завеÑÑенÑ
for(let response of responses) {
alert(`${response.url}: ${response.status}`); // Ð¿Ð¾ÐºÐ°Ð¶ÐµÑ 200 Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑлки
}
return responses;
})
// пÑеобÑазоваÑÑ Ð¼Ð°ÑÑив оÑвеÑов response в response.json(),
// ÑÑÐ¾Ð±Ñ Ð¿ÑоÑиÑаÑÑ ÑодеÑжимое каждого
.then(responses => Promise.all(responses.map(r => r.json())))
// вÑе JSON-оÑвеÑÑ Ð¾Ð±ÑабоÑанÑ, users - маÑÑив Ñ ÑезÑлÑÑаÑами
.then(users => users.forEach(user => alert(user.name)));
ÐÑли лÑбой из пÑомиÑов завеÑÑиÑÑÑ Ñ Ð¾Ñибкой, Ñо пÑомиÑ, возвÑаÑÑннÑй Promise.all, немедленно завеÑÑаеÑÑÑ Ñ ÑÑой оÑибкой.
ÐапÑимеÑ:
Promise.all([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("ÐÑибка!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).catch(alert); // Error: ÐÑибка!
ÐдеÑÑ Ð²ÑоÑой пÑÐ¾Ð¼Ð¸Ñ Ð·Ð°Ð²ÐµÑÑиÑÑÑ Ñ Ð¾Ñибкой ÑеÑез 2 ÑекÑндÑ. ÐÑо пÑиведÑÑ Ðº немедленной оÑибке в Promise.all, Ñак ÑÑо вÑполниÑÑÑ .catch: оÑибка ÑÑого пÑомиÑа ÑÑановиÑÑÑ Ð¾Ñибкой вÑего Promise.all.
ÐÑли один пÑÐ¾Ð¼Ð¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ Ñ Ð¾Ñибкой, Ñо веÑÑ Promise.all завеÑÑаеÑÑÑ Ñ Ð½ÐµÐ¹, полноÑÑÑÑ Ð·Ð°Ð±ÑÐ²Ð°Ñ Ð¿Ñо оÑÑалÑнÑе пÑомиÑÑ Ð² ÑпиÑке. ÐÑ
ÑезÑлÑÑаÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ.
ÐапÑимеÑ, еÑли Ñделано неÑколÑко вÑзовов fetch, как в пÑимеÑе вÑÑе, и один не пÑоÑÑл, Ñо оÑÑалÑнÑе бÑдÑÑ Ð²ÑÑ ÐµÑÑ Ð²ÑполнÑÑÑÑÑ, но Promise.all за ними Ñже не ÑмоÑÑиÑ. СкоÑее вÑего, они Ñак или инаÑе завеÑÑаÑÑÑ, но иÑ
ÑезÑлÑÑаÑÑ Ð±ÑдÑÑ Ð¿ÑоигноÑиÑованÑ.
Promise.all ниÑего не Ð´ÐµÐ»Ð°ÐµÑ Ð´Ð»Ñ Ð¸Ñ
оÑменÑ, Ñак как в пÑомиÑаÑ
вообÑе Ð½ÐµÑ ÐºÐ¾Ð½ÑепÑии «оÑменÑ». Рглаве Fetch: пÑеÑÑвание запÑоÑа Ð¼Ñ ÑаÑÑмоÑÑим AbortController, коÑоÑÑй Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ Ñ ÑÑим, но он не ÑвлÑеÑÑÑ ÑаÑÑÑÑ Promise API.
Promise.all(iterable) ÑазÑеÑÐ°ÐµÑ Ð¿ÐµÑедаваÑÑ Ð½Ðµ-пÑомиÑÑ Ð² iterable (пеÑебиÑаемом обÑекÑе)ÐбÑÑно, Promise.all(...) пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ Ð¿ÑомиÑов (ÑаÑе вÑего маÑÑив). Ðо еÑли лÑбой из ÑÑиÑ
обÑекÑов не ÑвлÑеÑÑÑ Ð¿ÑомиÑом, он пеÑедаÑÑÑÑ Ð² иÑоговÑй маÑÑив «как еÑÑÑ».
ÐапÑимеÑ, здеÑÑ ÑезÑлÑÑаÑ: [1, 2, 3]
Promise.all([
new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000)
}),
2,
3
]).then(alert); // 1, 2, 3
Таким обÑазом, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑедаваÑÑ Ñже гоÑовÑе знаÑениÑ, коÑоÑÑе не ÑвлÑÑÑÑÑ Ð¿ÑомиÑами, в Promise.all, иногда ÑÑо бÑÐ²Ð°ÐµÑ Ñдобно.
Promise.allSettled
СинÑакÑиÑ:
let promise = Promise.allSettled(iterable);
Promise.all завеÑÑаеÑÑÑ Ñ Ð¾Ñибкой, еÑли она Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð² лÑбом из пеÑеданнÑÑ
пÑомиÑов. ÐÑо подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÑиÑÑаÑий «вÑÑ Ð¸Ð»Ð¸ ниÑего», когда нам нÑÐ¶Ð½Ñ Ð²Ñе ÑезÑлÑÑаÑÑ Ð´Ð»Ñ Ð¿ÑодолжениÑ:
Promise.all([
fetch('/template.html'),
fetch('/style.css'),
fetch('/data.json')
]).then(render); // меÑÐ¾Ð´Ñ render нÑÐ¶Ð½Ñ ÑезÑлÑÑаÑÑ Ð²ÑеÑ
fetch
ÐеÑод Promise.allSettled вÑегда ждÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
пÑомиÑов. РмаÑÑиве ÑезÑлÑÑаÑов бÑдеÑ
{status:"fulfilled", value:ÑезÑлÑÑаÑ}Ð´Ð»Ñ ÑÑпеÑнÑÑ Ð·Ð°Ð²ÐµÑÑений,{status:"rejected", reason:оÑибка}Ð´Ð»Ñ Ð¾Ñибок.
ÐапÑимеÑ, Ð¼Ñ Ñ Ð¾Ñели Ð±Ñ Ð·Ð°Ð³ÑÑзиÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ множеÑÑве полÑзоваÑелей. Ðаже еÑли в каком-Ñо запÑоÑе оÑибка, Ð½Ð°Ñ Ð²ÑÑ Ñавно инÑеÑеÑÑÑÑ Ð¾ÑÑалÑнÑе.
ÐÑполÑзÑем Ð´Ð»Ñ ÑÑого Promise.allSettled:
let urls = [
'https://api.github.com/users/iliakan',
'https://api.github.com/users/remy',
'https://no-such-url'
];
Promise.allSettled(urls.map(url => fetch(url)))
.then(results => { // (*)
results.forEach((result, num) => {
if (result.status == "fulfilled") {
alert(`${urls[num]}: ${result.value.status}`);
}
if (result.status == "rejected") {
alert(`${urls[num]}: ${result.reason}`);
}
});
});
ÐаÑÑив results в ÑÑÑоке (*) бÑÐ´ÐµÑ Ñаким:
[
{status: 'fulfilled', value: ...обÑÐµÐºÑ Ð¾ÑвеÑа...},
{status: 'fulfilled', value: ...обÑÐµÐºÑ Ð¾ÑвеÑа...},
{status: 'rejected', reason: ...обÑÐµÐºÑ Ð¾Ñибки...}
]
То еÑÑÑ, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пÑомиÑа Ñ Ð½Ð°Ñ ÐµÑÑÑ ÐµÐ³Ð¾ ÑÑаÑÑÑ Ð¸ знаÑение/оÑибка.
ÐолиÑил
ÐÑли бÑаÑÐ·ÐµÑ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Promise.allSettled, Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ легко ÑделаÑÑ Ð¿Ð¾Ð»Ð¸Ñил:
if(!Promise.allSettled) {
Promise.allSettled = function(promises) {
return Promise.all(promises.map(p => Promise.resolve(p).then(value => ({
status: 'fulfilled',
value: value
}), error => ({
status: 'rejected',
reason: error
}))));
};
}
Ð ÑÑом коде promises.map беÑÑÑ Ð°ÑгÑменÑÑ, пÑевÑаÑÐ°ÐµÑ Ð¸Ñ
в пÑомиÑÑ (на вÑÑкий ÑлÑÑай) и добавлÑÐµÑ ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ Ð¾Ð±ÑабоÑÑик .then.
ÐÑÐ¾Ñ Ð¾Ð±ÑабоÑÑик пÑевÑаÑÐ°ÐµÑ ÑÑпеÑнÑй ÑезÑлÑÑÐ°Ñ value в {state:'fulfilled', value: value}, а оÑÐ¸Ð±ÐºÑ error в {state:'rejected', reason: error}. ÐÑо как Ñаз и еÑÑÑ ÑоÑÐ¼Ð°Ñ ÑезÑлÑÑаÑов Promise.allSettled.
ÐаÑем Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Promise.allSettled, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑезÑлÑÑаÑÑ Ð²ÑеÑ
пÑомиÑов, даже еÑли пÑи вÑполнении какого-Ñо Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð¾Ñибка.
Promise.race
ÐеÑод оÑÐµÐ½Ñ Ð¿Ð¾Ñ
ож на Promise.all, но ждÑÑ ÑолÑко пеÑвÑй вÑполненнÑй пÑомиÑ, из коÑоÑого беÑÑÑ ÑезÑлÑÑÐ°Ñ (или оÑибкÑ).
СинÑакÑиÑ:
let promise = Promise.race(iterable);
ÐапÑимеÑ, ÑÑÑ ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ 1:
Promise.race([
new Promise((resolve, reject) => setTimeout(() => resolve(1), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("ÐÑибка!")), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1
ÐÑÑÑÑее вÑÐµÑ Ð²ÑполнилÑÑ Ð¿ÐµÑвÑй пÑомиÑ, он и дал ÑезÑлÑÑаÑ. ÐоÑле ÑÑого оÑÑалÑнÑе пÑомиÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑÑÑÑÑ.
Promise.any
ÐеÑод оÑÐµÐ½Ñ Ð¿Ð¾Ñ
ож на Promise.race, но ждÑÑ ÑолÑко пеÑвÑй ÑÑпеÑно вÑполненнÑй пÑомиÑ, из коÑоÑого беÑÑÑ ÑезÑлÑÑаÑ.
ÐÑли ни один из пеÑеданнÑÑ
пÑомиÑов не завеÑÑиÑÑÑ ÑÑпеÑно, Ñогда возвÑаÑÑннÑй обÑÐµÐºÑ Promise бÑÐ´ÐµÑ Ð¾ÑклонÑн Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ AggregateError â ÑпеÑиалÑного обÑекÑа оÑибок, коÑоÑÑй Ñ
ÑÐ°Ð½Ð¸Ñ Ð²Ñе оÑибки пÑомиÑов в ÑвоÑм ÑвойÑÑве errors.
СинÑакÑиÑ:
let promise = Promise.any(iterable);
ÐапÑимеÑ, здеÑÑ, ÑезÑлÑÑаÑом бÑÐ´ÐµÑ 1:
Promise.any([
new Promise((resolve, reject) => setTimeout(() => reject(new Error("ÐÑибка!")), 1000)),
new Promise((resolve, reject) => setTimeout(() => resolve(1), 2000)),
new Promise((resolve, reject) => setTimeout(() => resolve(3), 3000))
]).then(alert); // 1
ÐеÑвÑй пÑÐ¾Ð¼Ð¸Ñ Ð² ÑÑом пÑимеÑе бÑл ÑамÑм бÑÑÑÑÑм, но он бÑл оÑклонÑн, поÑÑÐ¾Ð¼Ñ ÑезÑлÑÑаÑом ÑÑал вÑоÑой. ÐоÑле Ñого, как пеÑвÑй ÑÑпеÑно вÑполненнÑй пÑÐ¾Ð¼Ð¸Ñ Â«Ð²ÑигÑÐ°ÐµÑ Ð³Ð¾Ð½ÐºÑ», вÑе далÑнейÑие ÑезÑлÑÑаÑÑ Ð±ÑдÑÑ Ð¿ÑоигноÑиÑованÑ.
ÐÐ¾Ñ Ð¿ÑимеÑ, в коÑоÑом вÑе пÑомиÑÑ Ð¾ÑклонÑÑÑÑÑ:
Promise.any([
new Promise((resolve, reject) => setTimeout(() => reject(new Error("ÐÑибка!")), 1000)),
new Promise((resolve, reject) => setTimeout(() => reject(new Error("ÐÑÑ Ð¾Ð´Ð½Ð° оÑибка!")), 2000))
]).catch(error => {
console.log(error.constructor.name); // AggregateError
console.log(error.errors[0]); // Error: ÐÑибка!
console.log(error.errors[1]); // Error: ÐÑÑ Ð¾Ð´Ð½Ð° оÑибка!
});
Ðак Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе видеÑÑ, обÑекÑÑ Ð¾Ñибок Ð´Ð»Ñ Ð¾ÑклонÑннÑÑ
пÑомиÑов доÑÑÑÐ¿Ð½Ñ Ð² ÑвойÑÑве errors обÑекÑа AggregateError.
Promise.resolve/reject
ÐеÑÐ¾Ð´Ñ Promise.resolve и Promise.reject Ñедко иÑполÑзÑÑÑÑÑ Ð² ÑовÑеменном коде, Ñак как ÑинÑакÑÐ¸Ñ async/await (Ð¼Ñ ÑаÑÑмоÑÑим его ÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ) Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ñ
, в обÑем-Ñо, не нÑжнÑми.
ÐÑ ÑаÑÑмоÑÑим иÑ
здеÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ ÐºÐ°ÑÑинÑ, а Ñакже Ð´Ð»Ñ ÑеÑ
, кÑо по каким-Ñо пÑиÑинам не Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ async/await.
Promise.resolve
Promise.resolve(value)ÑоздаÑÑ ÑÑпеÑно вÑполненнÑй пÑÐ¾Ð¼Ð¸Ñ Ñ ÑезÑлÑÑаÑомvalue.
То же Ñамое, ÑÑо:
let promise = new Promise(resolve => resolve(value));
ÐÑÐ¾Ñ Ð¼ÐµÑод иÑполÑзÑÑÑ Ð´Ð»Ñ ÑовмеÑÑимоÑÑи: когда ожидаеÑÑÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ¸Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ пÑомиÑ.
ÐапÑимеÑ, ÑÑнкÑÐ¸Ñ loadCached ниже загÑÑÐ¶Ð°ÐµÑ URL и Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ (кеÑиÑÑеÑ) его ÑодеÑжимое. ÐÑи бÑдÑÑиÑ
вÑзоваÑ
Ñ Ñем же URL он ÑÑÑ Ð¶Ðµ ÑиÑÐ°ÐµÑ Ð¿ÑедÑдÑÑее ÑодеÑжимое из кеÑа, но иÑполÑзÑÐµÑ Promise.resolve, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ð¸Ð· него пÑомиÑ, Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð²Ð¾Ð·Ð²ÑаÑаемое знаÑение вÑегда бÑло пÑомиÑом:
let cache = new Map();
function loadCached(url) {
if (cache.has(url)) {
return Promise.resolve(cache.get(url)); // (*)
}
return fetch(url)
.then(response => response.text())
.then(text => {
cache.set(url,text);
return text;
});
}
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пиÑаÑÑ loadCached(url).then(â¦), поÑÐ¾Ð¼Ñ ÑÑо ÑÑнкÑÐ¸Ñ loadCached вÑегда возвÑаÑÐ°ÐµÑ Ð¿ÑомиÑ. ÐÑ Ð²Ñегда можем иÑполÑзоваÑÑ .then поÑле loadCached. ÐÑо и еÑÑÑ ÑÐµÐ»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Promise.resolve в ÑÑÑоке (*).
Promise.reject
Promise.reject(error)ÑоздаÑÑ Ð¿ÑомиÑ, завеÑÑÑннÑй Ñ Ð¾Ñибкойerror.
То же Ñамое, ÑÑо:
let promise = new Promise((resolve, reject) => reject(error));
Ðа пÑакÑике ÑÑÐ¾Ñ Ð¼ÐµÑод поÑÑи никогда не иÑполÑзÑеÑÑÑ.
ÐÑого
ÐÑ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð¸Ð»Ð¸ÑÑ Ñ ÑеÑÑÑÑ ÑÑаÑиÑеÑкими меÑодами клаÑÑа Promise:
Promise.all(promises)â Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð¿ÑомиÑов и возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив Ñ ÑезÑлÑÑаÑами. ÐÑли лÑбой из ÑказаннÑÑ Ð¿ÑомиÑов веÑнÑÑ Ð¾ÑибкÑ, Ñо ÑезÑлÑÑаÑом ÑабоÑÑPromise.allбÑÐ´ÐµÑ ÑÑа оÑибка, ÑезÑлÑÑаÑÑ Ð¾ÑÑалÑнÑÑ Ð¿ÑомиÑов бÑдÑÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑÑÑ.Promise.allSettled(promises)(добавлен недавно) â ждÑÑ, пока вÑе пÑомиÑÑ Ð·Ð°Ð²ÐµÑÑаÑÑÑ Ð¸ возвÑаÑÐ°ÐµÑ Ð¸Ñ ÑезÑлÑÑаÑÑ Ð² виде маÑÑива Ñ Ð¾Ð±ÑекÑами, Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ обÑекÑа два ÑвойÑÑва:status:"fulfilled", еÑли вÑполнен ÑÑпеÑно или"rejected", еÑли оÑибка,valueâ ÑезÑлÑÑаÑ, еÑли ÑÑпеÑно илиreasonâ оÑибка, еÑли неÑ.
Promise.race(promises)â Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¿ÐµÑвÑй вÑполненнÑй пÑомиÑ, коÑоÑÑй ÑÑановиÑÑÑ ÐµÐ³Ð¾ ÑезÑлÑÑаÑом, оÑÑалÑнÑе игноÑиÑÑÑÑÑÑ.Promise.any(promises)(добавлен недавно) â Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¿ÐµÑвÑй ÑÑпеÑно вÑполненнÑй пÑомиÑ, коÑоÑÑй ÑÑановиÑÑÑ ÐµÐ³Ð¾ ÑезÑлÑÑаÑом, оÑÑалÑнÑе игноÑиÑÑÑÑÑÑ. ÐÑли вÑе пеÑеданнÑе пÑомиÑÑ Ð¾ÑклоненÑ,AggregateErrorÑÑановиÑÑÑ Ð¾ÑибкойPromise.any.Promise.resolve(value)â возвÑаÑÐ°ÐµÑ ÑÑпеÑно вÑполнивÑийÑÑ Ð¿ÑÐ¾Ð¼Ð¸Ñ Ñ ÑезÑлÑÑаÑомvalue.Promise.reject(error)â возвÑаÑÐ°ÐµÑ Ð¿ÑÐ¾Ð¼Ð¸Ñ Ñ Ð¾Ñибкойerror.
Ðз вÑеÑ
пеÑеÑиÑленнÑÑ
меÑодов, ÑамÑй ÑаÑÑо иÑполÑзÑемÑй â ÑÑо, пожалÑй, Promise.all.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)