Baseline Widely available *
СводкаÐбÑÐµÐºÑ Promise
иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾ÑложеннÑÑ
и аÑинÑ
ÑоннÑÑ
вÑÑиÑлений.
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 300);
});
promise1.then((value) => {
console.log(value);
// Expected output: "foo"
});
console.log(promise1);
// Expected output: [object Promise]
СинÑакÑиÑ
new Promise(executor);
new Promise(function(resolve, reject) { ... });
ÐаÑамеÑÑÑ
ÐбÑÐµÐºÑ ÑÑнкÑии Ñ Ð´Ð²ÑÐ¼Ñ Ð°ÑгÑменÑами resolve
и reject
. ФÑнкÑÐ¸Ñ executor
полÑÑÐ°ÐµÑ Ð¾Ð±Ð° аÑгÑменÑа и вÑполнÑеÑÑÑ ÑÑазÑ, еÑÑ Ð´Ð¾ Ñого как конÑÑÑÑкÑÐ¾Ñ Ð²ÐµÑнÑÑ ÑозданнÑй обÑекÑ. ÐеÑвÑй аÑгÑÐ¼ÐµÐ½Ñ (resolve
) вÑзÑÐ²Ð°ÐµÑ ÑÑпеÑное иÑполнение пÑомиÑа, вÑоÑой (reject
) оÑклонÑÐµÑ ÐµÐ³Ð¾. ÐбÑÑно ÑÑнкÑÐ¸Ñ executor
опиÑÑÐ²Ð°ÐµÑ Ð²Ñполнение какой-Ñо аÑинÑ
Ñонной ÑабоÑÑ, по завеÑÑении коÑоÑой необÑ
одимо вÑзваÑÑ ÑÑнкÑÐ¸Ñ resolve
или reject
. ÐбÑаÑиÑе внимание, ÑÑо возвÑаÑаемое знаÑение ÑÑнкÑии executor
игноÑиÑÑеÑÑÑ.
ÐнÑеÑÑÐµÐ¹Ñ Promise
(пÑомиÑ) пÑедÑÑавлÑÐµÑ Ñобой обÑÑÑÐºÑ Ð´Ð»Ñ Ð·Ð½Ð°ÑениÑ, неизвеÑÑного на Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑомиÑа. Ðн позволÑÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ ÑезÑлÑÑаÑÑ Ð°ÑинÑ
ÑоннÑÑ
опеÑаÑий Ñак, как еÑли Ð±Ñ Ð¾Ð½Ð¸ бÑли ÑинÑ
ÑоннÑми: вмеÑÑо конеÑного ÑезÑлÑÑаÑа аÑинÑ
Ñонного меÑода возвÑаÑаеÑÑÑ Ñвоего Ñода обеÑание (доÑловнÑй пеÑевод Ñлова "пÑомиÑ") полÑÑиÑÑ ÑезÑлÑÑÐ°Ñ Ð² некоÑоÑÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð² бÑдÑÑем.
Promise
Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°Ñ
одиÑÑÑÑ Ð² ÑÑÑÑ
ÑоÑÑоÑниÑÑ
:
ÐÑи Ñоздании пÑÐ¾Ð¼Ð¸Ñ Ð½Ð°Ñ
одиÑÑÑ Ð² ожидании (pending), а заÑем Ð¼Ð¾Ð¶ÐµÑ ÑÑаÑÑ Ð¸ÑполненнÑм (fulfilled), веÑнÑв полÑÑеннÑй ÑезÑлÑÑÐ°Ñ (знаÑение), или оÑклонÑннÑм (rejected), веÑнÑв пÑиÑÐ¸Ð½Ñ Ð¾Ñказа. РлÑбом из ÑÑиÑ
ÑлÑÑаев вÑзÑваеÑÑÑ Ð¾Ð±ÑабоÑÑик, пÑикÑеплÑннÑй к пÑомиÑÑ Ð¼ÐµÑодом then
. (ÐÑли в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑÑика пÑÐ¾Ð¼Ð¸Ñ Ñже иÑполнен или оÑклонÑн, обÑабоÑÑик вÑÑ Ñавно бÑÐ´ÐµÑ Ð²Ñзван, Ñ.е. аÑинÑ
Ñонное иÑполнение пÑомиÑа и назнаÑение обÑабоÑÑика не бÑÐ´ÐµÑ Ð¿ÑоиÑÑ
одиÑÑ Ð² «ÑоÑÑоÑнии гонки», как, напÑимеÑ, в ÑлÑÑае Ñ ÑобÑÑиÑми в DOM.)
Так как меÑодÑ
и Promise.prototype.then()
Ñами возвÑаÑаÑÑ Ð¿ÑомиÑ, иÑ
можно вÑзÑваÑÑ ÑепоÑкой, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ ÑоединениÑ.Promise.prototype.catch()
ÐÑимеÑание: ÐовоÑÑÑ, ÑÑо пÑÐ¾Ð¼Ð¸Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² ÑоÑÑоÑнии завеÑÑÑн (settled) когда он или иÑполнен или оÑклонÑн, Ñ.е. в лÑбом ÑоÑÑоÑнии, кÑоме Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ (ÑÑо лиÑÑ ÑоÑма ÑеÑи, не ÑвлÑÑÑаÑÑÑ Ð½Ð°ÑÑоÑÑим ÑоÑÑоÑнием пÑомиÑа). Также можно вÑÑÑеÑиÑÑ ÑеÑмин иÑполнен (resolved) â ÑÑо знаÑÐ¸Ñ ÑÑо пÑÐ¾Ð¼Ð¸Ñ Ð·Ð°Ð²ÐµÑÑÑн или "заблокиÑован" в ожидании завеÑÑÐµÐ½Ð¸Ñ Ð´ÑÑгого пÑомиÑа. Ð ÑÑаÑÑе ÑоÑÑоÑÐ½Ð¸Ñ Ð¸ fates пÑиводиÑÑÑ Ð±Ð¾Ð»ÐµÐµ подÑобное опиÑание ÑеÑминологии.
СвойÑÑваPromise.length
ÐнаÑение ÑвойÑÑва вÑегда Ñавно 1 (колиÑеÑÑво аÑгÑменÑов конÑÑÑÑкÑоÑа).
Promise.prototype
ÐÑедÑÑавлÑÐµÑ Ð¿ÑоÑоÑип Ð´Ð»Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа Promise
.
Promise.all(iterable)
ÐÐ¶Ð¸Ð´Ð°ÐµÑ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð¿ÑомиÑов или оÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð»Ñбого из Ð½Ð¸Ñ .
ÐозвÑаÑÐ°ÐµÑ Ð¿ÑомиÑ, коÑоÑÑй иÑполниÑÑÑ Ð¿Ð¾Ñле иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑеÑ
пÑомиÑов в iterable
. Ð ÑлÑÑае, еÑли лÑбой из пÑомиÑов бÑÐ´ÐµÑ Ð¾ÑклонÑн, Promise.all
бÑÐ´ÐµÑ Ñакже оÑклонÑн.
Promise.allSettled(iterable)
ÐÐ¶Ð¸Ð´Ð°ÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð¿Ð¾Ð»ÑÑеннÑÑ Ð¿ÑомиÑов (как иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñак и оÑклонениÑ).
ÐозвÑаÑÐ°ÐµÑ Ð¿ÑомиÑ, коÑоÑÑй иÑполнÑеÑÑÑ ÐºÐ¾Ð³Ð´Ð° вÑе полÑÑеннÑе пÑомиÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ñ (иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð¸Ð»Ð¸ оÑклоненÑ), ÑодеÑжаÑий маÑÑив ÑезÑлÑÑаÑов иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑÑеннÑÑ Ð¿ÑомиÑов.
Promise.race(iterable)
ÐÐ¶Ð¸Ð´Ð°ÐµÑ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ оÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ð»Ñбого из полÑÑеннÑÑ Ð¿ÑомиÑов.
ÐозвÑаÑÐ°ÐµÑ Ð¿ÑомиÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¸Ñполнен или оÑклонÑн Ñ ÑезÑлÑÑаÑом иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÐµÑвого иÑполненного или оÑклонÑнного пÑомиÑа из iterable
.
Promise.reject(reason)
ÐозвÑаÑÐ°ÐµÑ Ð¿ÑомиÑ, оÑклонÑннÑй из-за reason
.
Promise.resolve(value)
ÐозвÑаÑÐ°ÐµÑ Ð¿ÑомиÑ, иÑполненнÑй Ñ ÑезÑлÑÑаÑом value
.
ÐбÑÐµÐºÑ Promise
ÑоздаÑÑÑÑ Ð¿Ñи помоÑи клÑÑевого Ñлова new
и Ñвоего конÑÑÑÑкÑоÑа. ÐонÑÑÑÑкÑÐ¾Ñ Promise
пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² каÑеÑÑве аÑгÑменÑа ÑÑнкÑиÑ, назÑваемÑÑ "иÑполниÑелÑ" (executor function). ÐÑа ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° пÑинимаÑÑ Ð´Ð²Ðµ ÑÑнкÑии-колбÑка в каÑеÑÑве паÑамеÑÑов. ÐеÑвÑй из ниÑ
(resolve
) вÑзÑваеÑÑÑ, когда аÑинÑ
ÑÐ¾Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑилаÑÑ ÑÑпеÑно и веÑнÑла ÑезÑлÑÑÐ°Ñ Ñвоего иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² виде знаÑениÑ. ÐÑоÑой колбÑк (reject
) вÑзÑваеÑÑÑ, когда опеÑаÑÐ¸Ñ Ð½Ðµ ÑдалаÑÑ, и возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение, ÑказÑваÑÑее на пÑиÑÐ¸Ð½Ñ Ð½ÐµÑдаÑи, ÑаÑе вÑего обÑÐµÐºÑ Ð¾Ñибки.
const myFirstPromise = new Promise((resolve, reject) => {
// вÑполнÑеÑÑÑ Ð°ÑинÑ
ÑÐ¾Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑаÑиÑ, коÑоÑÐ°Ñ Ð² иÑоге вÑзовеÑ:
//
// resolve(someValue); // ÑÑпеÑное завеÑÑение
// или
// reject("failure reason"); // неÑдаÑа
});
ЧÑÐ¾Ð±Ñ ÑнабдиÑÑ ÑÑнкÑÐ¸Ñ ÑÑнкÑионалÑноÑÑÑÑ Ð¿ÑомиÑов, нÑжно пÑоÑÑо веÑнÑÑÑ Ð² ней обÑÐµÐºÑ Promise
:
function myAsyncFunction(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = () => resolve(xhr.responseText);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
ÐÑимеÑÑ ÐÑоÑÑой пÑимеÑ
СоздаÑÑ Ð¿ÑомиÑ!
let myFirstPromise = new Promise((resolve, reject) => {
// ÐÑ Ð²ÑзÑваем resolve(...), когда аÑинÑ
ÑÐ¾Ð½Ð½Ð°Ñ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑилаÑÑ ÑÑпеÑно, и reject(...), когда она не ÑдалаÑÑ.
// Ð ÑÑом пÑимеÑе Ð¼Ñ Ð¸ÑполÑзÑем setTimeout(...), ÑÑÐ¾Ð±Ñ ÑимÑлиÑоваÑÑ Ð°ÑинÑ
ÑоннÑй код.
// Ð ÑеалÑноÑÑи вÑ, ÑкоÑее вÑего, бÑдеÑе иÑполÑзоваÑÑ XHR, HTML5 API или ÑÑо-Ñо подобное.
setTimeout(function () {
resolve("Success!"); // УÑа! ÐÑÑ Ð¿ÑоÑло Ñ
оÑоÑо!
}, 250);
});
myFirstPromise.then((successMessage) => {
// successMessage - ÑÑо ÑÑо Ñгодно, ÑÑо Ð¼Ñ Ð¿ÐµÑедали в ÑÑнкÑÐ¸Ñ resolve(...) вÑÑе.
// ÐÑо необÑзаÑелÑно ÑÑÑока, но еÑли ÑÑо вÑего лиÑÑ ÑообÑение об ÑÑпеÑном завеÑÑении, ÑÑо навеÑнÑка бÑÐ´ÐµÑ Ð¾Ð½Ð°.
console.log("УÑа! " + successMessage);
});
ÐÑодвинÑÑÑй пÑимеÑ
СоздаÑÑ Ð¿ÑомиÑ!
<button id="btn">СоздаÑÑ Promise!</button>
<div id="log"></div>
ÐаннÑй неболÑÑой пÑÐ¸Ð¼ÐµÑ Ð¿Ð¾ÐºÐ°Ð·ÑÐ²Ð°ÐµÑ Ð¼ÐµÑ
анизм ÑабоÑÑ Ñ Promise
. ÐеÑод testPromise()
вÑзÑваеÑÑÑ Ð¿Ñи каждом нажаÑии на <button>
. ÐÑи ÑÑом ÑоздаÑÑÑÑ Ð¿ÑомиÑ, коÑоÑÑй ÑÑпеÑно вÑполнÑеÑÑÑ Ð¿Ñи помоÑи window.setTimeout
, Ñо знаÑением 'result'
в ÑлÑÑайном инÑеÑвале Ð¾Ñ 1 до 3-Ñ
ÑекÑнд.
иÑполнение пÑомиÑа пÑоÑоколиÑÑеÑÑÑ Ð¿Ñи помоÑи пÑÐ¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ p1.then
. ÐÑо показÑÐ²Ð°ÐµÑ ÐºÐ°Ðº ÑинÑ
ÑÐ¾Ð½Ð½Ð°Ñ ÑаÑÑÑ Ð¼ÐµÑода оÑвÑзана Ð¾Ñ Ð°ÑинÑ
Ñонного завеÑÑÐµÐ½Ð¸Ñ Ð¿ÑомиÑа.
var promiseCount = 0;
function testPromise() {
var thisPromiseCount = ++promiseCount;
var log = document.getElementById('log');
log.insertAdjacentHTML('beforeend', thisPromiseCount +
') ÐапÑÑк (запÑÑк ÑинÑ
Ñонного кода)
');
// СоздаÑм пÑомиÑ, возвÑаÑаÑÑее 'result' (по иÑÑеÑении 3-Ñ
ÑекÑнд)
var p1 = new Promise(
// ФÑнкÑÐ¸Ñ ÑазÑеÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð·Ð°Ð²ÐµÑÑиÑÑ ÑÑпеÑно или
// оÑклониÑÑ Ð¿ÑомиÑ
function(resolve, reject) {
log.insertAdjacentHTML('beforeend', thisPromiseCount +
') ÐапÑÑк пÑомиÑа (запÑÑк аÑинÑ
Ñонного кода)
');
// ÐÑо вÑего лиÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ Ð°ÑинÑ
ÑонноÑÑи
window.setTimeout(
function() {
// ÐÑÐ¾Ð¼Ð¸Ñ Ð¸Ñполнен!
resolve(thisPromiseCount)
}, Math.random() * 2000 + 1000);
});
// УказÑваем, ÑÑо ÑделаÑÑ Ñ Ð¸ÑполненнÑм пÑомиÑом
p1.then(
// ÐапиÑÑваем в пÑоÑокол
function(val) {
log.insertAdjacentHTML('beforeend', val +
') ÐÑÐ¾Ð¼Ð¸Ñ Ð¸Ñполнен (аÑинÑ
ÑоннÑй код завеÑÑÑн)
');
});
log.insertAdjacentHTML('beforeend', thisPromiseCount +
') ÐÑÐ¾Ð¼Ð¸Ñ Ñоздан (ÑинÑ
ÑоннÑй код завеÑÑÑн)
');
}
if ("Promise" in window) {
btn = document.getElementById("btn");
btn.addEventListener("click", testPromise);
} else {
log = document.getElementById("log");
log.innerHTML =
"Live example not available as your browser doesn't support the Promise interface.";
}
if ("Promise" in window) {
let btn = document.getElementById("btn");
btn.addEventListener("click", testPromise);
} else {
log = document.getElementById("log");
log.innerHTML =
"ÐемонÑÑÑаÑÐ¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°, поÑколÑÐºÑ Ð²Ð°Ñ Ð±ÑаÑÐ·ÐµÑ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ <code>Promise<code>.";
}
ÐаннÑй пÑÐ¸Ð¼ÐµÑ Ð·Ð°Ð¿ÑÑкаеÑÑÑ Ð¿Ñи нажаÑии на кнопкÑ. ÐÐ»Ñ ÑÑого вам необÑ
одим бÑаÑзеÑ, поддеÑживаÑÑий Promise
. ÐÑи поÑледоваÑелÑнÑÑ
нажаÑиÑÑ
на ÐºÐ½Ð¾Ð¿ÐºÑ Ñ ÐºÐ¾ÑоÑким инÑеÑвалом, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑвидеÑÑ ÐºÐ°Ðº ÑазлиÑнÑе пÑомиÑа бÑдÑÑ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð¾Ð´Ð¸Ð½ за дÑÑгим.
ÐÑÑгой пÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Promise
и XMLHttpRequest
Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпен в ÑепозиÑоÑии MDNpromise-test на GitHub. ÐÑ Ñакже можеÑе поÑмоÑÑеÑÑ ÐµÐ³Ð¾ в дейÑÑвии. ÐаждÑй Ñаг пÑокомменÑиÑован и Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе подÑобно иÑÑледоваÑÑ Promise и XHR.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4