page(Doc) not found /ru/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
Promise
(пÑомиÑ) - ÑÑо обÑекÑ, пÑедÑÑавлÑÑÑий ÑезÑлÑÑÐ°Ñ ÑÑпеÑного или неÑдаÑного завеÑÑÐµÐ½Ð¸Ñ Ð°ÑинÑ
Ñонной опеÑаÑии. Так как болÑÑинÑÑво лÑдей полÑзÑÑÑÑÑ Ñже ÑозданнÑми пÑомиÑами, ÑÑо ÑÑководÑÑво наÑнÑм Ñ Ð¾Ð±ÑÑÑÐ½ÐµÐ½Ð¸Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐµÑнÑвÑиÑ
ÑÑ Ð¿ÑомиÑов до обÑÑÑÐ½ÐµÐ½Ð¸Ñ Ð¿ÑинÑипов ÑозданиÑ.
Ð ÑÑÑноÑÑи, пÑÐ¾Ð¼Ð¸Ñ - ÑÑо возвÑаÑаемÑй обÑекÑ, в коÑоÑÑй Ð²Ñ Ð·Ð°Ð¿Ð¸ÑÑваеÑе два колбÑка вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑедаÑÑ Ð¸Ñ ÑÑнкÑии.
ÐапÑимеÑ, вмеÑÑо ÑÑаÑомодной ÑÑнкÑии, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð´Ð²Ð° колбÑка и вÑзÑÐ²Ð°ÐµÑ Ð¾Ð´Ð¸Ð½ из Ð½Ð¸Ñ Ð² завиÑимоÑÑи Ð¾Ñ ÑÑпеÑного или неÑдаÑного завеÑÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии:
function doSomethingOldStyle(successCallback, failureCallback) {
console.log("ÐоÑово.");
// УÑпеÑ
в половине ÑлÑÑаев.
if (Math.random() > 0.5) {
successCallback("УÑпеÑ
");
} else {
failureCallback("ÐÑибка");
}
}
function successCallback(result) {
console.log("УÑпеÑно завеÑÑено Ñ ÑезÑлÑÑаÑом " + result);
}
function failureCallback(error) {
console.log("ÐавеÑÑено Ñ Ð¾Ñибкой " + error);
}
doSomethingOldStyle(successCallback, failureCallback);
â¦ÑовÑеменнÑе ÑÑнкÑии возвÑаÑаÑÑ Ð¿ÑомиÑ, в коÑоÑÑй Ð²Ñ Ð·Ð°Ð¿Ð¸ÑÑваеÑе ваÑи колбÑки:
function doSomething() {
return new Promise((resolve, reject) => {
console.log("ÐоÑово.");
// УÑпеÑ
в половине ÑлÑÑаев.
if (Math.random() > 0.5) {
resolve("УÑпеÑ
");
} else {
reject("ÐÑибка");
}
});
}
const promise = doSomething();
promise.then(successCallback, failureCallback);
â¦Ð¸Ð»Ð¸ пÑоÑÑо:
doSomething().then(successCallback, failureCallback);
ÐÑ Ð½Ð°Ð·Ñваем ÑÑо аÑÐ¸Ð½Ñ ÑоннÑм вÑзовом ÑÑнкÑии. У ÑÑого ÑоглаÑÐµÐ½Ð¸Ñ ÐµÑÑÑ Ð½ÐµÑколÑко пÑеимÑÑеÑÑв. ÐавайÑе ÑаÑÑмоÑÑим Ð¸Ñ .
ÐаÑанÑииРоÑлиÑие Ð¾Ñ ÑÑаÑомоднÑÑ Ð¿ÐµÑеданнÑÑ ÐºÐ¾Ð»Ð±Ñков пÑÐ¾Ð¼Ð¸Ñ Ð´Ð°ÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе гаÑанÑии:
Ðо наиболее непоÑÑедÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð»Ñза Ð¾Ñ Ð¿ÑомиÑов - ÑепоÑка вÑзовов (chaining).
ЦепоÑка вÑзововÐбÑÐ°Ñ Ð½Ñжда - вÑполнÑÑÑ Ð´Ð²Ðµ или более аÑÐ¸Ð½Ñ ÑоннÑÑ Ð¾Ð¿ÐµÑаÑии одна за дÑÑгой, пÑиÑÑм ÐºÐ°Ð¶Ð´Ð°Ñ ÑледÑÑÑÐ°Ñ Ð½Ð°ÑинаеÑÑÑ Ð¿Ñи ÑÑпеÑном завеÑÑении пÑедÑдÑÑей и иÑполÑзÑÐµÑ ÑезÑлÑÑÐ°Ñ ÐµÑ Ð²ÑполнениÑ. ÐÑ ÑеализÑем ÑÑо, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ ÑепоÑÐºÑ Ð²Ñзовов пÑомиÑов (promise chain).
ÐÐ¾Ñ Ð² ÑÑм магиÑ: ÑÑнкÑÐ¸Ñ then
возвÑаÑÐ°ÐµÑ Ð½Ð¾Ð²Ñй пÑомиÑ, оÑлиÑаÑÑийÑÑ Ð¾Ñ Ð¿ÐµÑвонаÑалÑного:
let promise = doSomething();
let promise2 = promise.then(successCallback, failureCallback);
или
let promise2 = doSomething().then(successCallback, failureCallback);
ÐÑоÑой пÑÐ¾Ð¼Ð¸Ñ Ð¿ÑедÑÑавлÑÐµÑ Ð·Ð°Ð²ÐµÑÑение не ÑолÑко doSomething()
, но и ÑÑнкÑий successCallback
или failureCallback
, пеÑеданнÑÑ
вами, а они Ñоже могÑÑ Ð±ÑÑÑ Ð°ÑинÑ
ÑоннÑми ÑÑнкÑиÑми, возвÑаÑаÑÑими пÑомиÑ. Ð ÑÑом ÑлÑÑае вÑе колбÑки, добавленнÑе к promise2
бÑдÑÑ Ð¿Ð¾ÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð² оÑеÑÐµÐ´Ñ Ð·Ð° пÑомиÑом, возвÑаÑаемÑм successCallback
или failureCallback
.
Ðо ÑÑÑи, каждÑй вÑзваннÑй пÑÐ¾Ð¼Ð¸Ñ Ð¾Ð·Ð½Ð°ÑÐ°ÐµÑ ÑÑпеÑное завеÑÑение пÑедÑдÑÑÐ¸Ñ Ñагов в ÑепоÑке.
РанÑÑе вÑполнение неÑколÑÐºÐ¸Ñ Ð°ÑÐ¸Ð½Ñ ÑоннÑÑ Ð¾Ð¿ÐµÑаÑий дÑÑг за дÑÑгом пÑиводило к клаÑÑиÑеÑкой "ÐавилонÑкой баÑне" колбÑков:
doSomething(function (result) {
doSomethingElse(
result,
function (newResult) {
doThirdThing(
newResult,
function (finalResult) {
console.log("ÐÑоговÑй ÑезÑлÑÑаÑ: " + finalResult);
},
failureCallback,
);
},
failureCallback,
);
}, failureCallback);
Ð ÑовÑеменнÑÑ ÑÑнкÑиÑÑ Ð¼Ñ Ð·Ð°Ð¿Ð¸ÑÑваем колбÑки в возвÑаÑаемÑе пÑомиÑÑ - ÑоÑмиÑÑем ÑепоÑÐºÑ Ð¿ÑомиÑов:
doSomething()
.then(function (result) {
return doSomethingElse(result);
})
.then(function (newResult) {
return doThirdThing(newResult);
})
.then(function (finalResult) {
console.log("ÐÑоговÑй ÑезÑлÑÑаÑ: " + finalResult);
})
.catch(failureCallback);
ÐÑгÑменÑÑ then
необÑзаÑелÑнÑ, а catch(failureCallback)
- ÑÑо ÑокÑаÑение Ð´Ð»Ñ then(null, failureCallback)
. ÐÐ¾Ñ ÐºÐ°Ðº ÑÑо вÑÑажено Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑÑелоÑнÑÑ
ÑÑнкÑий:
doSomething()
.then((result) => doSomethingElse(result))
.then((newResult) => doThirdThing(newResult))
.then((finalResult) => {
console.log(`ÐÑоговÑй ÑезÑлÑÑаÑ: ${finalResult}`);
})
.catch(failureCallback);
Ðажно: ÐÑегда возвÑаÑайÑе пÑомиÑÑ Ð² return, инаÑе колбÑки не бÑдÑÑ ÑÑÐµÐ¿Ð»ÐµÐ½Ñ Ð¸ оÑибки могÑÑ Ð±ÑÑÑ Ð½Ðµ Ð¿Ð¾Ð¹Ð¼Ð°Ð½Ñ (ÑÑÑелоÑнÑе ÑÑнкÑии неÑвно возвÑаÑаÑÑ ÑезÑлÑÑаÑ, еÑли Ñкобки {} вокÑÑг Ñела ÑÑнкÑии опÑÑенÑ).
ЦепоÑка вÑзовов поÑле catchÐожно пÑодолжиÑÑ ÑепоÑÐºÑ Ð²Ñзовов поÑле оÑибки, Ñ. е. поÑле catch
, ÑÑо полезно Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
дейÑÑвий даже поÑле Ñого, как дейÑÑвие веÑнÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð² ÑепоÑке вÑзовов. Ðиже пÑиведÑн пÑимеÑ:
new Promise((resolve, reject) => { console.log('ÐаÑало'); resolve(); }) .then(() => { throw new Error('Ðде-Ñо пÑоизоÑла оÑибка'); console.log('ÐÑведи ÑÑо'); }) .catch(() => { console.log('ÐÑведи Ñо'); }) .then(() => { console.log('ÐÑведи ÑÑо, неÑмоÑÑÑ Ð½Ð¸ на ÑÑо'); });
Ð ÑезÑлÑÑаÑе вÑведеÑÑÑ Ð´Ð°Ð½Ð½Ñй ÑекÑÑ:
ÐаÑало ÐÑведи Ñо ÐÑведи ÑÑо, неÑмоÑÑÑ Ð½Ð¸ на ÑÑо
ÐамеÑÑÑе, ÑÑо ÑекÑÑ "ÐÑведи ÑÑо" не вÑвелÑÑ, поÑÐ¾Ð¼Ñ ÑÑо "Ðде-Ñо пÑоизоÑла оÑибка" пÑивела к оÑказÑ
РаÑпÑоÑÑÑанение оÑибкиÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ñанее замеÑиÑÑ, ÑÑо failureCallback
повÑоÑÑеÑÑÑ ÑÑи Ñаза в "pyramid of doom", а в ÑепоÑке пÑомиÑов вÑего лиÑÑ Ð¾Ð´Ð¸Ð½ Ñаз:
doSomething() .then(result => doSomethingElse(result)) .then(newResult => doThirdThing(newResult)) .then(finalResult => console.log(`ÐÑоговÑй ÑезÑлÑÑаÑ: ${finalResult}`)) .catch(failureCallback);
РоÑновном, ÑепоÑка пÑомиÑов оÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð²Ñполнение кода, еÑли где-либо пÑоизоÑла оÑибка, и вмеÑÑо ÑÑого иÑÐµÑ Ð´Ð°Ð»ÐµÐµ по ÑепоÑке обÑабоÑÑики оÑибок. ÐÑо оÑÐµÐ½Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ðµ на Ñо, как ÑабоÑÐ°ÐµÑ ÑÐ¸Ð½Ñ ÑоннÑй код:
try { let result = syncDoSomething(); let newResult = syncDoSomethingElse(result); let finalResult = syncDoThirdThing(newResult); console.log(`ÐÑоговÑй ÑезÑлÑÑаÑ: ${finalResult}`); } catch(error) { failureCallback(error); }
ÐÑа ÑиммеÑÑÐ¸Ñ Ñ ÑинÑ
ÑоннÑм кодом лÑÑÑе вÑего показÑÐ²Ð°ÐµÑ ÑÐµÐ±Ñ Ð² ÑинÑакÑиÑеÑком ÑаÑ
аÑе async
/await
в ECMAScript 2017:
async function foo() { try { let result = await doSomething(); let newResult = await doSomethingElse(result); let finalResult = await doThirdThing(newResult); console.log(`ÐÑоговÑй ÑезÑлÑÑаÑ: ${finalResult}`); } catch(error) { failureCallback(error); } }
РабоÑа данного кода оÑнована на пÑомиÑаÑ
. ÐÐ»Ñ Ð¿ÑимеÑа здеÑÑ Ð¸ÑполÑзÑеÑÑÑ ÑÑнкÑÐ¸Ñ doSomething()
, коÑоÑÐ°Ñ Ð²ÑÑÑеÑалаÑÑ Ñанее. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑоÑиÑаÑÑ Ð±Ð¾Ð»ÑÑе о ÑинÑакÑиÑе здеÑÑ
ÐÑомиÑÑ ÑеÑаÑÑ Ð¾ÑновнÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¿Ð¸Ñамид, обÑабоÑÐºÑ Ð²ÑÐµÑ Ð¾Ñибок, даже вÑзовов иÑклÑÑений и пÑогÑаммнÑÑ Ð¾Ñибок. ÐÑо оÑнова Ð´Ð»Ñ ÑÑнкÑионалÑного поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð°ÑÐ¸Ð½Ñ ÑоннÑÑ Ð¾Ð¿ÐµÑаÑий.
Создание пÑомиÑа вокÑÑг ÑÑаÑого колбÑкаPromise
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñоздан Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑаÑÑÑ
API.
Ридеале, вÑе аÑинÑ
ÑоннÑе ÑÑнкÑии Ñже Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð¿ÑомиÑ. Ðо ÑвÑ, некоÑоÑÑе APIs до ÑиÑ
Ð¿Ð¾Ñ Ð¾Ð¶Ð¸Ð´Ð°ÑÑ ÑÑпеÑного или неÑдаÑного колбÑка пеÑеданнÑÑ
по ÑÑаÑинке. ТипиÑнÑй пÑимеÑ: setTimeout()
ÑÑнкÑиÑ:
setTimeout(() => saySomething("10 seconds passed"), 10000);
СмеÑивание ÑÑаÑого колбÑк-ÑÑÐ¸Ð»Ñ Ð¸ пÑомиÑов пÑоблемаÑиÑно. Ð ÑлÑÑае неÑдаÑного завеÑÑÐµÐ½Ð¸Ñ saySomething
или пÑогÑаммной оÑибки, нелÑÐ·Ñ Ð¾Ð±ÑабоÑаÑÑ Ð¾ÑибкÑ.
Ð ÑÑаÑÑÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ обеÑнÑÑÑ ÑÑнкÑÐ¸Ñ Ð² пÑомиÑ. ХоÑоÑий Ñон обоÑаÑиваÑÑ Ð¿ÑоблемаÑиÑнÑе ÑÑнкÑии на Ñамом низком возможном ÑÑовне, и болÑÑе никогда Ð¸Ñ Ð½Ðµ вÑзÑваÑÑ Ð½Ð°Ð¿ÑÑмÑÑ:
const wait = ms => new Promise(resolve => setTimeout(resolve, ms)); wait(10000).then(() => saySomething("10 seconds")).catch(failureCallback);
Ð ÑÑÑноÑÑи, конÑÑÑÑкÑÐ¾Ñ Ð¿ÑомиÑа ÑÑановиÑÑÑ Ð¸ÑполниÑелем ÑÑнкÑии, коÑоÑÑй позволÑÐµÑ Ð½Ð°Ð¼ ÑезолвиÑÑ Ð¸Ð»Ð¸ ÑежекÑиÑÑ Ð¿ÑÐ¾Ð¼Ð¸Ñ Ð²ÑÑÑнÑÑ. Так как setTimeout
вÑегда ÑÑпеÑен, Ð¼Ñ Ð¾Ð¿ÑÑÑили reject в ÑÑом ÑлÑÑае.
Promise.resolve()
и Promise.reject()
коÑоÑкий ÑпоÑоб ÑоздаÑÑ Ñже ÑÑпеÑнÑе или оÑклонÑннÑе пÑомиÑÑ ÑооÑвеÑÑÑвенно. ÐÑо иногда бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾.
Promise.all()
и Promise.race()
- два меÑода запÑÑÑиÑÑ Ð°ÑинÑ
ÑоннÑе опеÑаÑии паÑаллелÑно.
ÐоÑледоваÑелÑное вÑполнение композиÑии возможно пÑи помоÑи Ñ Ð¸ÑÑоÑÑи JavaScript:
[func1, func2].reduce((p, f) => p.then(f), Promise.resolve());
ФакÑиÑеÑки, Ð¼Ñ Ð¿ÑевÑаÑаем маÑÑив аÑинÑ
ÑоннÑÑ
ÑÑнкÑий в ÑепоÑÐºÑ Ð¿ÑомиÑов ÑавноÑилÑно: Promise.resolve().then(func1).then(func2);
ÐÑо Ñакже можно ÑделаÑÑ, обÑединив композиÑÐ¸Ñ Ð² ÑÑнкÑиÑ, в ÑÑнкÑионалÑном ÑÑиле пÑогÑаммиÑованиÑ:
const applyAsync = (acc,val) => acc.then(val); const composeAsync = (...funcs) => x => funcs.reduce(applyAsync, Promise.resolve(x));
composeAsync
ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð»Ñбое колиÑеÑÑво ÑÑнкÑий в каÑеÑÑве аÑгÑменÑов и веÑнÑÑ Ð½Ð¾Ð²ÑÑ ÑÑнкÑÐ¸Ñ ÐºÐ¾ÑоÑÐ°Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ð² паÑамеÑÑаÑ
наÑалÑное знаÑение, пеÑеданное по ÑепоÑке. ÐÑо Ñдобно, поÑÐ¾Ð¼Ñ ÑÑо некоÑоÑÑе или вÑе ÑÑнкÑии могÑÑ Ð±ÑÑÑ Ð»Ð¸Ð±Ð¾ аÑинÑ
ÑоннÑми, либо ÑинÑ
ÑоннÑми, и они гаÑанÑиÑованно вÑполнÑÑÑÑ Ð² пÑавилÑной поÑледоваÑелÑноÑÑи:
const transformData = composeAsync(func1, asyncFunc1, asyncFunc2, func2); transformData(data);
Ð ECMAScript 2017, поÑледоваÑелÑнÑе композиÑии могÑÑ Ð±ÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÑм ÑпоÑобом Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ async/await:
for (const f of [func1, func2]) { await f(); }ÐоÑÑдок вÑполнениÑ
ЧÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑÑÑпÑизов, ÑÑнкÑии, пеÑеданнÑе в then
никогда не бÑдÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ ÑинÑ
Ñонно, даже Ñ Ñже ÑазÑеÑÑннÑм пÑомиÑом:
Promise.resolve().then(() => console.log(2)); console.log(1); // 1, 2
ÐмеÑÑо немедленного вÑполнениÑ, пеÑÐµÐ´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑÑÐ°Ð½ÐµÑ Ð² оÑеÑÐµÐ´Ñ Ð¼Ð¸ÐºÑозадаÑ, а знаÑÐ¸Ñ Ð²ÑполниÑÑÑ, когда оÑеÑÐµÐ´Ñ Ð±ÑÐ´ÐµÑ Ð¿ÑÑÑой в конÑе ÑекÑÑего вÑзова JavaScript Ñикла ÑобÑÑий (event loop), Ñ.е. оÑÐµÐ½Ñ ÑкоÑо:
const wait = ms => new Promise(resolve => setTimeout(resolve, ms)); wait().then(() => console.log(4)); Promise.resolve().then(() => console.log(2)).then(() => console.log(3)); console.log(1); // 1, 2, 3, 4ÐложенноÑÑÑ
ÐÑоÑÑÑе ÑепоÑки promise лÑÑÑе оÑÑавлÑÑÑ Ð±ÐµÐ· вложений, Ñак как вложенноÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑезÑлÑÑаÑом небÑежной ÑÑÑÑкÑÑÑÑ. СмоÑÑиÑе ÑаÑпÑоÑÑÑанÑннÑе оÑибки.
ÐложенноÑÑÑ - ÑÑо ÑпÑавлÑÑÑÐ°Ñ ÑÑÑÑкÑÑÑа, огÑаниÑиваÑÑÐ°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов catch. Ð ÑаÑÑноÑÑи, вложеннÑй catch ÑолÑко пеÑÐµÑ Ð²Ð°ÑÑÐ²Ð°ÐµÑ Ñбои в Ñвоей облаÑÑи и ниже, а не оÑибки вÑÑе в ÑепоÑке за пÑеделами вложенной облаÑÑи. ÐÑи пÑавилÑном иÑполÑзовании ÑÑо даÑÑ Ð±Ð¾Ð»ÑÑÑÑ ÑоÑноÑÑÑ Ð² извлеÑение оÑибок:
doSomethingCritical() .then(result => doSomethingOptional() .then(optionalResult => doSomethingExtraNice(optionalResult)) .catch(e => {})) // ÐгноÑиÑÑеÑÑÑ ÐµÑли необÑзаÑелÑнÑе паÑамеÑÑ Ð½Ðµ вÑкинÑл иÑклÑÑение .then(() => moreCriticalStuff()) .catch(e => console.log("ÐÑиÑиÑеÑÐºÐ°Ñ Ð¾Ñибка: " + e.message));
ÐбÑаÑиÑе внимание, ÑÑо необÑзаÑелÑнÑй Ñаги здеÑÑ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ñ Ð¾ÑÑÑÑпом.
ÐнÑÑÑенний опеÑаÑÐ¾Ñ catch нейÑÑализÑÐµÑ Ð¸ пеÑÐµÑ Ð²Ð°ÑÑÐ²Ð°ÐµÑ Ð¾Ñибки ÑолÑко Ð¾Ñ doSomethingOptional() и doSomethingExtraNice(), поÑле Ñего код возобновлÑеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ moreCriticalStuff(). Ðажно, ÑÑо в ÑлÑÑае ÑÐ±Ð¾Ñ doSomethingCritical() его оÑибка пеÑÐµÑ Ð²Ð°ÑÑваеÑÑÑ ÑолÑко поÑледним (внеÑним) catch.
ЧаÑÑÑе оÑибкиРÑÑом Ñазделе ÑобÑÐ°Ð½Ñ ÑаÑÑÑе оÑибки, возникаÑÑие пÑи Ñоздании ÑепоÑек пÑомиÑов. ÐеÑколÑко ÑÐ°ÐºÐ¸Ñ Ð¾Ñибок можно ÑвидеÑÑ Ð² ÑледÑÑÑем пÑимеÑе:
// ÐÐ»Ð¾Ñ Ð¾Ð¹ пÑимеÑ! ТÑи оÑибки! doSomething().then(function(result) { doSomethingElse(result) // ÐабÑл веÑнÑÑÑ Ð¿ÑÐ¾Ð¼Ð¸Ñ Ð¸Ð· внÑÑÑенней ÑепоÑки + неÑмеÑÑное влаживание .then(newResult => doThirdThing(newResult)); }).then(() => doFourthThing()); // ÐабÑл законÑиÑÑ ÑепоÑÐºÑ Ð¼ÐµÑодом catch
ÐеÑÐ²Ð°Ñ Ð¾Ñибка ÑÑо непÑавилÑно ÑÑепиÑÑ Ð²ÐµÑи Ð¼ÐµÐ¶Ð´Ñ Ñобой. Такое пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÐºÐ¾Ð³Ð´Ð° Ð¼Ñ ÑоздаÑм пÑÐ¾Ð¼Ð¸Ñ Ð½Ð¾ забÑваем веÑнÑÑÑ ÐµÐ³Ð¾. Ðак ÑледÑÑвие, ÑепоÑка Ñломана, но пÑавилÑнее бÑло Ð±Ñ ÑказаÑÑ ÑÑо ÑепеÑÑ Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð´Ð²Ðµ незавиÑимÑе ÑепоÑки, ÑоÑевнÑÑÑиеÑÑ Ð·Ð° пÑаво ÑазÑеÑиÑÑÑ Ð¿ÐµÑвой. ÐÑо ознаÑаеÑ, ÑÑо doFourthThing()
не бÑÐ´ÐµÑ Ð¶Ð´Ð°ÑÑ doSomethingElse()
или doThirdThing()
пока ÑÐ¾Ñ Ð·Ð°ÐºÐ¾Ð½ÑиÑÑÑ, и бÑÐ´ÐµÑ Ð¸ÑполнÑÑÑÑ Ð¿Ð°ÑаллелÑно Ñ Ð½Ð¸Ð¼Ð¸, ÑÑо, веÑоÑÑно, не Ñо ÑÑо Ñ
оÑел ÑазÑабоÑÑик. ÐÑделÑнÑе ÑепоÑки Ñакже имеÑÑ Ð¾ÑделÑнÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¾Ñибок, ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº необÑабоÑаннÑм оÑибкам.
ÐÑоÑÐ°Ñ Ð¾Ñибка ÑÑо излиÑнÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑÑ, вклÑÑÐ°Ñ Ð¿ÐµÑвÑÑ Ð¾ÑибкÑ. ÐложенноÑÑÑ Ñакже огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи внÑÑÑÐµÐ½Ð½Ð¸Ñ Ð¾Ð±ÑабоÑÑиков оÑибок, еÑли ÑÑо не Ñо Ñего Ñ Ð¾Ñел ÑазÑабоÑÑик, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к необÑабоÑаннÑм оÑибкам. ÐÑимеÑом ÑÑого ÑвлÑеÑÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ ÐºÐ°Ðº не нÑжно ÑоздаваÑÑ Ð¿ÑомиÑÑ, коÑоÑÑй комбиниÑÑÐµÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑÑ Ñ ÑÑезмеÑнÑм иÑполÑзованием конÑÑÑÑкÑоÑа пÑомиÑов Ð´Ð»Ñ Ð¾Ð±Ð¾ÑаÑÐ¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° коÑоÑÑй Ñже иÑполÑзÑÐµÑ Ð¿ÑомиÑÑ.
ТÑеÑÑÑ Ð¾Ñибка ÑÑо забÑÑÑ Ð·Ð°ÐºÐ¾Ð½ÑиÑÑ ÑепоÑÐºÑ ÐºÐ»ÑÑевÑм Ñловом catch
. ÐезаконÑеннÑе ÑепоÑки пÑиводÑÑ Ðº необÑабоÑаннÑм оÑÑоÑжениÑм пÑомиÑов в болÑÑинÑÑве бÑаÑзеÑов.
ХоÑоÑим пÑимеÑом ÑвлÑеÑÑÑ Ð²Ñегда либо возвÑаÑаÑÑ Ð»Ð¸Ð±Ð¾ заканÑиваÑÑ ÑепоÑки пÑомиÑов, и как ÑолÑко Ð²Ñ Ð¿Ð¾Ð»ÑÑаеÑе новÑй пÑомиÑ, возвÑаÑайÑе его ÑÑÐ°Ð·Ñ Ð¶Ðµ, ÑÑÐ¾Ð±Ñ Ð½Ðµ ÑÑложнÑÑÑ ÐºÐ¾Ð´ излиÑней вложенноÑÑÑÑ:
doSomething() .then(function(result) { return doSomethingElse(result); }) .then(newResult => doThirdThing(newResult)) .then(() => doFourthThing()) .catch(error => console.log(error));
ÐбÑаÑиÑе внимание ÑÑо () => x
ÑÑо ÑокÑаÑÑÐ½Ð½Ð°Ñ ÑоÑма () => { return x; }
.
ТепеÑÑ Ñ Ð½Ð°Ñ Ð¸Ð¼ÐµÐµÑÑÑ ÐµÐ´Ð¸Ð½ÑÑÐ²ÐµÐ½Ð½Ð°Ñ Ð¾Ð¿ÑеделÑÐ½Ð½Ð°Ñ ÑепоÑка Ñ Ð¿ÑавилÑной обÑабоÑкой оÑибок.
ÐÑполÑзование async
/await
пÑедоÑвÑаÑÐ°ÐµÑ Ð±Ð¾Ð»ÑÑинÑÑво, еÑли не вÑе вÑÑеÑказаннÑе оÑибки, но взамен поÑвлÑеÑÑÑ Ð´ÑÑÐ³Ð°Ñ ÑаÑÑÐ°Ñ Ð¾Ñибка â забÑÑÑ ÐºÐ»ÑÑевое Ñлово await
.
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