УÑвÑÑÑ, Ñо ви ÑпÑвак-ÑÑпеÑзÑÑка Ñ Ð²Ð°ÑÑ Ñани поÑÑÑйно доÑкÑлÑÑÑÑ Ð·Ð°Ð¿Ð¸ÑаннÑми пÑо майбÑÑнÑй Ñингл.
Щоб вони пеÑеÑÑали вам набÑидаÑи, ви обÑÑÑÑÑе ÑозÑÑлаÑи Ñм Ñингл Ñк ÑÑлÑки-но вÑн бÑде випÑÑений. Ðи даÑÑе ÑвоÑм ÑанаÑам лиÑÑоÑок, в Ñкий вони можÑÑÑ Ð²Ð¿Ð¸ÑаÑи ÑвÑй e-mail. Ðа Ñкий вони оÑÑимаÑÑÑ Ð°Ð±Ð¾ пÑÑÐ½Ñ Ñк ÑÑлÑки-но вона бÑде гоÑова, або ж, ÑкÑо ÑоÑÑ Ð¿Ñде не Ñак (напÑиклад, в ÑÑÑдÑÑ ÑÑанеÑÑÑÑ Ð¿Ð¾Ð¶ÐµÐ¶Ð°), Ñо вони оÑÑимаÑÑÑ ÑповÑÑеннÑ, Ñо пÑÑÐ½Ñ Ð²Ð·Ð°Ð³Ð°Ð»Ñ Ð½Ðµ бÑде.
ÐÑÑм добÑе: ви, бо вам бÑлÑÑе не доÑкÑлÑÑÑÑ, а ÑанаÑи, бо можÑÑÑ Ð±ÑлÑÑе не пеÑеживаÑи, Ñо пÑопÑÑÑÑÑÑ Ð½Ð¾Ð²Ð¸Ð¹ Ñингл.
Це аналогÑÑ Ð· ÑеалÑного жиÑÑÑ Ð´Ð»Ñ ÑиÑÑаÑÑй з Ñкими ми ÑаÑÑо ÑÑикаÑмоÑÑ Ð² пÑогÑамÑваннÑ:
- РкодââвиÑобникâ, коÑÑий ÑобиÑÑ ÑоÑÑ, Ñо Ð·Ð°Ð¹Ð¼Ð°Ñ ÑаÑ. ÐапÑиклад, заванÑажÑÑ Ð´Ð°Ð½Ñ Ð· меÑежÑ. ÐгÑдно з наÑÐ¾Ñ Ð°Ð½Ð°Ð»Ð¾Ð³ÑÑÑ Ñе âÑпÑвакâ.
- РкодââÑпоживаÑâ, коÑÑий оÑÑкÑÑ Ð¾ÑÑимаÑи ÑезÑлÑÑÐ°Ñ Ð²Ñд кодÑ-âвиÑобникаâ, Ñк ÑÑлÑки-но ÑезÑлÑÑÐ°Ñ Ð±Ñде гоÑовий. Цей ÑезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶Ðµ знадобиÑиÑÑ Ð±Ð°Ð³Ð°ÑÑом ÑÑнкÑÑÑм. Ð¦Ñ ÑÑнкÑÑÑ â âÑанаÑиâ
- ÐÑомÑÑ (англ. Promise) â Ñе ÑпеÑÑалÑний обâÑÐºÑ Ð² JavaScript, коÑÑий звâÑзÑÑ âвиÑобникаâ Ñ âÑпоживаÑаâ Ñазом. РконÑекÑÑÑ Ð½Ð°ÑÐ¾Ñ Ð°Ð½Ð°Ð»Ð¾Ð³ÑÑ â Ñе âÑпиÑок пÑдпиÑникÑвâ. Ðод-âвиÑобникâ виконÑÑÑÑÑÑ ÑÑÑлÑки ÑаÑÑ, ÑкÑлÑки поÑÑÑбно Ñоб оÑÑимаÑи ÑезÑлÑÑаÑ, а пÑомÑÑ ÑобиÑÑ ÑезÑлÑÑÐ°Ñ Ð´Ð¾ÑÑÑпним Ð´Ð»Ñ ÐºÐ¾Ð´Ñ-âÑпоживаÑаâ, Ñкий на нÑого пÑдÑивÑÑ, Ñк ÑÑлÑки-но код-âвиÑобникâ повеÑне ÑезÑлÑÑаÑ.
ÐналогÑÑ Ð½Ðµ зовÑÑм ÑоÑна, оÑкÑлÑки ÑеалÑзаÑÑÑ Ð¿ÑомÑÑÑв в JavaScript набагаÑо ÑкладнÑÑа нÑж пÑоÑÑий ÑпиÑок пÑдпиÑок. РпÑомÑÑÑв бÑлÑÑе можливоÑÑей Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ñ. Ðле Ð´Ð»Ñ Ð¿Ð¾ÑаÑÐºÑ Ð²Ð°ÑÑо поÑаÑи з пÑоÑÑÑÑого.
СинÑакÑÐ¸Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ð¿ÑомÑÑа:
let promise = new Promise(function(resolve, reject) {
// код, коÑÑий повеÑне ÑезÑлÑÑÐ°Ñ (по аналогÑÑ ÐºÐ¾Ð´â"виÑобник", код-"ÑпÑвак")
});
ФÑнкÑÑÑ Ð¿ÐµÑедана в new Promise називаÑÑÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²Ñем. Ðоли ÑÑвоÑÑÑÑÑÑÑ new Promise вона запÑÑкаÑÑÑÑÑ Ð°Ð²ÑомаÑиÑно. РнÑй знаÑ
одиÑÑÑÑ ÐºÐ¾Ð´ âвиÑобникâ коÑÑий зÑеÑÑÐ¾Ñ Ð¿Ð¾Ð²ÐµÑне ÑезÑлÑÑаÑ. РконÑекÑÑÑ Ð½Ð°ÑÐ¾Ñ Ð°Ð½Ð°Ð»Ð¾Ð³ÑÑ: виконавеÑÑ â Ñе âÑпÑвакâ.
ÐÑгÑменÑи ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÑÑ resolve Ñ reject â Ñе колбеки, ÑÐºÑ Ð½Ð°Ð´Ð°Ñ Ñам JavaScript. ÐÐ°Ñ ÐºÐ¾Ð´ Ð¼Ð°Ñ Ð±ÑÑи ÑÑлÑки вÑеÑÐµÐ´Ð¸Ð½Ñ ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÑÑ.
ÐÑÑÐ»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð½Ñ ÑвоÑÑ ÑобоÑи ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÐµÑÑ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° викликаÑи один з ÑÐ¸Ñ ÐºÐ¾Ð»Ð±ÐµÐºÑв:
resolve(value)â ÑкÑо код ÑÑпÑÑно виконавÑÑ, з ÑезÑлÑÑаÑомvalue. (resolve пеÑекладаÑÑÑÑÑ Ñк виÑÑÑиÑи, ÑозвâÑзаÑи)reject(error)â ÑкÑо виникла помилка,errorâ обâÑÐºÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸. (reject в пеÑÐµÐºÐ»Ð°Ð´Ñ Ð²ÑÐ´Ñ Ð¸Ð»Ð¸Ñи, вÑдмовиÑи)
ÐÑже, ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÐµÑÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑÑ Ð°Ð²ÑомаÑиÑно Ñ Ð½Ð°Ð¼Ð°Ð³Ð°ÑÑÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñи ÑобоÑÑ. РпоÑÑм Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ Ð¿ÐµÑÑий аÑгÑÐ¼ÐµÐ½Ñ (resolve) ÑкÑо ÑпÑоба бÑла ÑÑпÑÑÐ½Ð¾Ñ Ñи дÑÑгий аÑгÑÐ¼ÐµÐ½Ñ (reject) ÑкÑо виникла помилка.
new Promise повеÑÑÐ°Ñ Ð¾Ð±âÑÐºÑ promise. Ð ÑÑого обâÑкÑа Ñ Ð´Ð²Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ: state Ñ result:
stateâ ÑпоÑаÑÐºÑ Ð¼Ð°Ñ Ð·Ð½Ð°ÑеннÑ"pending"(оÑÑкÑваннÑ). Ð Ð´Ð°Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð·Ð¼ÑнÑÑÑÑÑÑ Ð°Ð±Ð¾ на"fulfilled"ÑкÑо ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÐµÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð»Ð° аÑгÑменÑresolve, або на"rejected", ÑкÑо ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÐµÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð»Ð°reject.resultâ ÑпоÑаÑÐºÑ Ð¼Ð°Ñ Ð·Ð½Ð°ÑеннÑundefined. Ð Ð´Ð°Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð½Ñ Ð·Ð¼ÑнÑÑÑÑÑÑ Ð°Ð±Ð¾ наvalueÑкÑо ÑÑнкÑÑÑ-виконавеÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð»Ð°resolve(value), або ж наerror, ÑкÑо ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÐµÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð»Ð°reject(error).
promise â обÑÑÑнка; resolve â ÑозвâÑзÑваÑи, виÑÑÑÑваÑи; value â знаÑеннÑ, вмÑÑÑ; fulfilled â виконаний, здÑйÑнений; reject â вÑÐ´Ñ Ð¸Ð»ÑÑи, ÑкаÑовÑваÑи; error â помилка; rejected â вÑÐ´Ñ Ð¸Ð»ÐµÐ½Ð¸Ð¹, ÑкаÑований; settled â ÑÑÑалений, завеÑÑений, вÑÐ¸Ñ Ð¾Ð¼Ð¸Ñений;
ÐÑже, виконавеÑÑ Ð·ÑеÑÑÐ¾Ñ Ð¿ÐµÑеводиÑÑ promise в один з наÑÑÑпниÑ
ÑÑанÑв:
ÐÑзнÑÑе ми ÑозглÑнемо, Ñк âÑанаÑиâ можÑÑÑ Ð¿ÑдпиÑÑваÑиÑÑ Ð½Ð° ÑÑ Ð·Ð¼Ñни.
ÐижÑе пÑиклад конÑÑÑÑкÑоÑа пÑомÑÑа Ñ Ð¿ÑоÑÑÐ¾Ñ ÑÑнкÑÑÑ-виконавÑÑ Ð· кодом-âвиÑобникомâ, Ñо Ð²Ð¸Ð´Ð°Ñ ÑезÑлÑÑÐ°Ñ Ð· заÑÑÐ¸Ð¼ÐºÐ¾Ñ (ÑеÑез setTimeout):
let promise = new Promise(function(resolve, reject) {
// ÑÑнкÑÑÑ-виÑобник викликаÑÑÑÑÑ Ð°Ð²ÑомаÑиÑно, пÑи Ð²Ð¸ÐºÐ»Ð¸ÐºÑ new Promise
// ÑеÑез 1 ÑекÑÐ½Ð´Ð½Ñ Ð¿Ð¾Ð²ÑдомлÑÑÑÑÑÑ Ñо задаÑа Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð· ÑезÑлÑÑаÑом "завеÑÑено"
setTimeout(() => resolve("завеÑÑено"), 1000);
});
Ðи можемо ÑпоÑÑеÑÑгаÑи за двома моменÑами запÑÑÑивÑи код виÑе:
-
ФÑнкÑÑÑ-виконавеÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°ÑÑÑÑÑ Ð¾Ð´ÑÐ°Ð·Ñ Ð¶ пÑи викликÑ
new Promise. -
ФÑнкÑÑÑ-виконавеÑÑ Ð¾ÑÑимÑÑ Ð´Ð²Ð° аÑгÑменÑи:
resolveÑrejectâ ÑÑ ÑÑнкÑÑÑ Ð²Ð±ÑÐ´Ð¾Ð²Ð°Ð½Ñ Ð² JavaScript, ÑÐ¾Ð¼Ñ Ð½Ð°Ð¼ непоÑÑÑбно ÑÑ ÑÑвоÑÑваÑи. Ðам ÑлÑд вÑÑого Ð»Ð¸Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñи Ð¾Ð´Ð½Ñ Ð· Ð½Ð¸Ñ Ð¿Ð¾ гоÑовноÑÑÑ.ЧеÑез Ð¾Ð´Ð½Ñ ÑекÑÐ½Ð´Ñ âобÑобкиâ виконавеÑÑ Ð²Ð¸ÐºÐ»Ð¸Ñе
resolve("done"), Ñоб пеÑедаÑи ÑезÑлÑÑаÑ. Ð¦Ñ Ð´ÑÑ Ð·Ð¼ÑниÑÑ ÑÑан обâÑкÑаpromise(Ñо бÑв ÑÑвоÑений конÑÑÑÑкÑоÑомnew Promise) з"pending"на"fulfilled":
Це бÑв пÑиклад ÑÑпÑÑно Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð¾Ñ Ð·Ð°Ð´Ð°ÑÑ, в ÑезÑлÑÑаÑÑ Ð¼Ð¸ оÑÑимали âвиконаний (fulfilled)â пÑомÑÑ.
РоÑÑ Ð¿Ñиклад коли ÑÑнкÑÑÑ-виконавеÑÑ Ð¿Ð¾Ð²ÑдомиÑÑ Ð½Ð°Ð¼, Ñо задаÑа виконана з помилкоÑ:
let promise = new Promise(function(resolve, reject) {
// ÑеÑез 1 ÑекÑÐ½Ð´Ñ Ð¿Ð¾Ð²ÑдомлÑÑÑÑÑÑ Ñо задаÑа виконана з помилкоÑ
setTimeout(() => reject(new Error("Ðоооой!")), 1000);
});
Ðиклик пеÑÑого аÑгÑменÑа (reject(...)) пеÑеводиÑÑ ÑÑан обâÑкÑа promise в "rejected":
ÐÑдÑбâÑмо пÑомÑÐ¶Ð½Ñ Ð¿ÑдÑÑмки: ÑÑнкÑÑÑ-виконавеÑÑ Ð²Ð¸ÐºÐ¾Ð½ÑÑ Ð·Ð°Ð´Ð°ÑÑ (ÑоÑÑ, Ñо Ñк пÑавило поÑÑебÑÑ ÑаÑÑ), поÑÑм викликаÑÑÑÑÑ Ð¾Ð´Ð¸Ð½ з меÑодÑв resolve Ñи reject, в залежноÑÑÑ Ð²Ñд ÑÑпÑÑноÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñ. Ð¯ÐºÑ ÑвоÑÑ ÑеÑÐ³Ð¾Ñ Ð·Ð¼ÑнÑÑÑÑ ÑÑан обâÑкÑа Ñкий бÑв повеÑнÑÑий з конÑÑÑÑкÑоÑа new Promise.
ÐÑомÑÑ â в ÑÑÐ°Ð½Ñ resolve Ñи reject бÑдемо називаÑи âзавеÑÑенимâ (англ. settled), на вÑдмÑÐ½Ñ Ð²Ñд поÑаÑкового ÑÑÐ°Ð½Ñ Ð¿ÑомÑÑа âв оÑÑкÑваннÑâ (англ. pending).
ФÑнкÑÑÑ-виконавеÑÑ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ викликаÑи ÑÑлÑки ÑоÑÑ Ð¾Ð´Ð½Ðµ: resolve або reject. СÑан пÑомÑÑа може бÑÑи змÑнений лиÑе один Ñаз.
ÐÑÑ Ð½Ð°ÑÑÑÐ¿Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ resolve Ñи reject бÑдÑÑÑ Ð¿ÑоÑгноÑованÑ:
let promise = new Promise(function(resolve, reject) {
resolve("завеÑÑено");
reject(new Error("â¦")); // ÑгноÑÑÑÑÑÑÑ
setTimeout(() => resolve("â¦")); // ÑгноÑÑÑÑÑÑÑ
});
ÐÐ´ÐµÑ Ð² ÑомÑ, Ñо ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²ÐµÑÑ Ð¼Ð¾Ð¶Ðµ маÑи ÑÑлÑки один ÑезÑлÑÑаÑ: або ÑÑпÑÑний ÑезÑлÑÑаÑ, або помилкÑ.
ÐвеÑнÑÑÑ ÑвагÑ, Ñо меÑоди resolve/reject можÑÑÑ Ð¿ÑийнÑÑи ÑÑлÑки один аÑгÑÐ¼ÐµÐ½Ñ (або жодного) й ÑгноÑÑÑÑÑ Ð²ÑÑ ÑнÑÑ Ð°ÑгÑменÑи.
reject з обâÑкÑом ErrorУ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑкÑо ÑоÑÑ Ð¿ÑÑло не Ñак, ÑÑнкÑÑÑ-виконавÑÑ ÑлÑд викликаÑи дÑÑгий аÑгÑÐ¼ÐµÐ½Ñ (reject). Ð reject можна пеÑедаÑи аÑгÑÐ¼ÐµÐ½Ñ Ð±ÑдÑ-Ñкого ÑÐ¸Ð¿Ñ (Ñк Ñ Ð² resolve), але ÑекомендÑÑÑÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи обâÑÐºÑ Error (Ñи ÑÑпадкований вÑд нÑого обâÑкÑ). Ð§Ð¾Ð¼Ñ Ñак? СкоÑо вам ÑÑане зÑозÑмÑло.
resolve/rejectÐа пÑакÑиÑÑ ÑÑнкÑÑÑ-виконавеÑÑ ÑобиÑÑ ÑоÑÑ Ð°ÑинÑ
Ñонне Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ resolve/reject ÑеÑез деÑкий ÑаÑ. ÐÑоÑе можна викликаÑи resolve Ñи reject одÑÐ°Ð·Ñ Ñ Ñе Ñеж пÑаÑÑваÑиме:
let promise = new Promise(function(resolve, reject) {
// задаÑа, Ñо не поÑÑебÑÑ ÑаÑÑ
resolve(123); // моменÑалÑно видаÑÑÑ ÑезÑлÑÑаÑ: 123
});
ÐÐ»Ñ Ð¿ÑикладÑ, Ñаке може ÑÑаÑиÑÑ ÐºÐ¾Ð»Ð¸ JavaScript поÑав виконÑваÑи Ð¿ÐµÐ²Ð½Ñ Ð·Ð°Ð´Ð°ÑÑ, пÑоÑе одÑÐ°Ð·Ñ Ð¶ побаÑив, Ñо ÑанÑÑе ÑÑ Ð²Ð¸ÐºÐ¾Ð½Ñвали й ÑезÑлÑÑÐ°Ñ Ð·Ð°ÐºÐµÑований.
Така ÑиÑÑаÑÑÑ Ð½Ð¾ÑмалÑна. ÐÑомÑÑ ÑÑÐ°Ñ Ð·Ð°Ð²ÐµÑÑеним одÑÐ°Ð·Ñ Ð¶.
state Ñ result â внÑÑÑÑÑнÑÐлаÑÑивоÑÑÑ state Ñ result â Ñе внÑÑÑÑÑÐ½Ñ / вбÑÐ´Ð¾Ð²Ð°Ð½Ñ / âпÑдкапоÑнÑâ влаÑÑивоÑÑÑ Ð¾Ð±âÑкÑа ÑÑвоÑÑваного конÑÑÑÑÑоÑом Promise. Ðони Ñ âпÑд капоÑомâ, але ми не маÑмо до ниÑ
пÑÑмого доÑÑÑпÑ. ÐÐ»Ñ Ð¾Ð±Ñобки ÑезÑлÑÑаÑÑ ÑлÑд викоÑиÑÑовÑваÑи меÑоди: .then/.catch/.finally. ÐÑо ниÑ
пÑде мова далÑ.
СпоживаÑÑ: then, catch
ÐбâÑкÑ, ÑÑвоÑÑваний конÑÑÑÑÑоÑом Promise, ÑлÑжиÑÑ Ð·Ð²âÑÐ·Ð½Ð¾Ñ Ð»Ð°Ð½ÐºÐ¾Ñ Ð¼Ñж ÑÑнкÑÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð²Ñем (код âвиÑобникâ Ñи âÑпÑвакâ) Ñ ÑÑнкÑÑÑми-ÑпоживаÑами (âÑанаÑамиâ), коÑÑÑ Ð¾ÑÑимаÑÑÑ Ð°Ð±Ð¾ ÑезÑлÑÑаÑ, або помилкÑ. ФÑнкÑÑÑ-ÑпоживаÑÑ Ð¼Ð¾Ð¶Ð½Ð° заÑеÑÑÑÑÑваÑи (пÑдпиÑаÑи на ÑозÑилкÑ) за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¼ÐµÑодÑв .then Ñа .catch.
then
ÐайважливÑÑий Ñ ÑÑндаменÑалÑний меÑод â .then.
СинÑакÑиÑ:
promise.then(
function(result) { /* обÑоблÑÑ ÑÑпÑÑне Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ */ },
function(error) { /* обÑоблÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ */ }
);
ÐеÑÑий аÑгÑÐ¼ÐµÐ½Ñ Ð¼ÐµÑода .then â Ñе ÑÑнкÑÑÑ, Ñо викликаÑÑÑÑÑ ÐºÐ¾Ð»Ð¸ пÑомÑÑ ÑÑпÑÑно виконÑÑÑÑÑÑ, ÑобÑо ÑодÑ, коли state пеÑеÑ
одиÑÑ Ð·Ñ ÑÑÐ°Ð½Ñ "pending" в "resolved". Ð¦Ñ ÑÑнкÑÑÑ Ð°ÑгÑменÑом оÑÑимÑÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑомÑÑа.
ÐÑÑгим аÑгÑменÑом меÑод .then пÑÐ¸Ð¹Ð¼Ð°Ñ ÑÑнкÑÑÑ, Ñо викликаÑÑÑÑÑ ÐºÐ¾Ð»Ð¸ пÑомÑÑ Ð¿ÐµÑеÑ
одиÑÑ Ð² ÑÑан "rejected". Ð¦Ñ ÑÑнкÑÑÑ Ð°ÑгÑменÑом оÑÑимÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ.
ÐÐ»Ñ Ð¿ÑикладÑ, наÑÑÑпним Ñином виглÑÐ´Ð°Ñ ÑеакÑÑÑ Ð½Ð° ÑÑпÑÑно виконаний пÑомÑÑ:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve("завеÑÑено!"), 1000);
});
// пÑÑÐ»Ñ Ð·Ð°Ð¿ÑÑÐºÑ resolve запÑÑÑиÑÑÑÑ Ð¿ÐµÑÑий аÑгÑÐ¼ÐµÐ½Ñ Ð² .then
promise.then(
result => alert(result), // виведе "завеÑÑено!" ÑеÑез 1 ÑекÑндÑ
error => alert(error) // не запÑÑÑиÑÑÑÑ Ð½Ñколи
);
ТÑÑ Ð·Ð°Ð¿ÑÑÑилаÑÑ Ð¿ÐµÑÑа ÑÑнкÑÑÑ.
Рв Ð²Ð¸Ð¿Ð°Ð´ÐºÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ в пÑомÑÑÑ â виконаÑÑÑÑÑ Ð´ÑÑга:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => reject(new Error("Ðоооой!")), 1000);
});
// меÑод reject запÑÑÑиÑÑ Ð´ÑÑÐ³Ñ ÑÑнкÑÑÑ Ð¿ÐµÑÐµÐ´Ð°Ð½Ñ Ð² .then
promise.then(
result => alert(result), // не запÑÑÑиÑÑÑÑ Ð½Ñколи
error => alert(error) // виведе "Error: Ðоооой!" ÑеÑез 1 ÑекÑндÑ
);
ЯкÑо ми заÑÑÐºÐ°Ð²Ð»ÐµÐ½Ñ ÑÑлÑки в ÑÑпÑÑÐ½Ð¾Ð¼Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð´Ð°ÑÑ, ÑÐ¾Ð´Ñ Ð² .then можна пеÑедаÑи ÑÑлÑки Ð¾Ð´Ð½Ñ ÑÑнкÑÑÑ:
let promise = new Promise(resolve => {
setTimeout(() => resolve("завеÑÑено!"), 1000);
});
promise.then(alert); // виведе "завеÑÑено!" ÑеÑез 1 ÑекÑндÑ
catch
Якби ми Ñ
оÑÑли обÑобиÑи лиÑе помилкÑ, ÑÐ¾Ð´Ñ Ð¼Ð¸ можемо викоÑиÑÑаÑи null Ñк пеÑÑий аÑгÑÐ¼ÐµÐ½Ñ .then(null, errorHandlingFunction). Ðбо можемо ÑкоÑиÑÑаÑиÑÑ Ð¼ÐµÑодом .catch(errorHandlingFunction), коÑÑий зÑобиÑÑ Ñе ж Ñаме:
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("Ðоооой!")), 1000);
});
// .catch(f) Ñе Ñаме Ñо й promise.then(null, f)
promise.catch(alert); // виведе "Error: Ðоооой!" ÑеÑез 1 ÑекÑндÑ
Ðиклик .catch(f) â Ñе ÑкоÑоÑений ваÑÑÐ°Ð½Ñ .then(null, f).
Cleanup: finally
Ðо аналогÑÑ Ð· блоком finally Ð·Ñ Ð·Ð²Ð¸Ñайного try {...} catch {...}, Ñ Ð¿ÑомÑÑÑв Ñакож Ñ ÑвÑй меÑод finally
Ðиклик .finally(f) подÑбний до .then(f, f), в ÑÐ¾Ð¼Ñ ÑенÑÑ, Ñо f виконаÑÑÑÑÑ Ð² бÑдÑ-ÑÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ, коли пÑомÑÑ Ð¿ÐµÑейде в ÑÑан "виконано (settled)". Як Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑкÑо ÑÑан пÑомÑÑа ÑÑане resolved, Ñак Ñ Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑкÑо rejected.
finally добÑе пÑдÑ
одиÑÑ Ð´Ð»Ñ ÑиÑÑки, напÑиклад зÑпинки ÑндикаÑоÑа заванÑаженнÑ, ÑомÑ, Ñо його поÑÑÑбно зÑпиниÑи незалежно вÑд ÑезÑлÑÑаÑÑ.
ÐапÑиклад зÑпинка заванÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑндикаÑоÑÑв, закÑиÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑÑÐ±Ð½Ð¸Ñ Ð¿ÑдклÑÑÐµÐ½Ñ ÑоÑо.
ÐодÑмайÑе пÑо Ñе Ñк пÑо завеÑÑÐµÐ½Ð½Ñ Ð²ÐµÑÑÑки. Ðезалежно вÑд Ñого, бÑла веÑÑÑка Ñ Ð¾ÑоÑÐ¾Ñ Ñи поганоÑ, ÑкÑлÑки дÑÑзÑв на нÑй бÑло, ми вÑе одно Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¿ÑибÑаÑи по ÑÑ Ð·Ð°Ð²ÐµÑÑеннÑ.
Ðод може виглÑдаÑи Ñак:
new Promise((resolve, reject) => {
/* зÑобиÑи ÑоÑÑ, Ñо займе ÑÐ°Ñ Ñ Ð¿Ð¾ÑÑм викликаÑи resolve/reject */
})
// виконаÑÑÑÑÑ ÐºÐ¾Ð»Ð¸ пÑомÑÑ Ð·Ð°Ð²ÐµÑÑиÑÑÑÑ (ÑÑане "settled"), незалежно вÑд Ñого, ÑÑпÑÑно Ñи нÑ
.finally(() => зÑпиниÑи ÑндикаÑÐ¾Ñ Ð·Ð°Ð²Ð°Ð½ÑаженнÑ)
// оÑож ÑндикаÑÐ¾Ñ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð²Ð¶Ð´Ð¸ зÑпинÑÑимеÑÑÑÑ Ð¿ÐµÑед Ñим Ñк ми бÑдемо обÑоблÑÑи ÑезÑлÑÑаÑ/помилкÑ
.then(result => вивеÑÑи ÑезÑлÑÑаÑ, err => вивеÑÑи помилкÑ)
ÐÑоÑе finally(f) ÑоÑно не Ñ Ð¿ÑевдонÑмом then(f,f).
РдекÑлÑка Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¸Ñ Ð²ÑдмÑнноÑÑей:
-
ÐбÑобник
finallyне пÑÐ¸Ð¹Ð¼Ð°Ñ Ð°ÑгÑменÑÑв. Ðfinallyми не знаÑмо Ñк бÑв завеÑÑений пÑомÑÑ, ÑÑпÑÑно Ñи нÑ. Ð Ñе ноÑмалÑно, ÑÐ¾Ð¼Ñ Ñо зазвиÑай наÑе Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»ÑÐ³Ð°Ñ Ð² ÑÐ¾Ð¼Ñ Ñоб виконаÑи âзагалÑнÑâ пÑоÑедÑÑи по завеÑÑеннÑ.ÐодивÑÑÑÑÑ Ð½Ð° наведений виÑе пÑиклад: Ñк баÑиÑе, обÑобник
finallyне Ð¼Ð°Ñ Ð°ÑгÑменÑÑв, а ÑезÑлÑÑÐ°Ñ Ð¿ÑомÑÑÑ Ð¾Ð±ÑоблÑÑÑÑÑÑ Ð½Ð°ÑÑÑпним обÑобником. -
ÐбÑобник
finallyпÑопÑÑÐºÐ°Ñ ÑезÑлÑÑÐ°Ñ Ñи Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ Ð´Ð¾ наÑÑÑÐ¿Ð½Ð¸Ñ Ð¾Ð±ÑобникÑв.ÐапÑиклад, ÑÑÑ ÑезÑлÑÑÐ°Ñ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð¸ÑÑ ÑеÑез
finallyдоthen:new Promise((resolve, reject) => { setTimeout(() => resolve("ÑезÑлÑÑаÑ"), 2000) }) .finally(() => alert("ÐÑомÑÑ Ð·Ð°Ð²ÐµÑÑений")) // запÑÑкаÑÑÑÑÑ Ð¿ÐµÑÑим .then(result => alert(result)); // <-- .then показÑÑ "ÑезÑлÑаÑ"Як баÑиÑе, âÑезÑлÑÑаÑâ, Ñкий повеÑÑÐ°Ñ Ð¿ÐµÑÑий пÑомÑÑ, пеÑедаÑÑÑÑÑ ÑеÑез
finallyнаÑÑÑпномÑthen.Це дÑже зÑÑÑно, оÑкÑлÑки
finallyне пÑизнаÑений Ð´Ð»Ñ Ð¾Ð±Ñобки ÑезÑлÑÑаÑÑ Ð¿ÑомÑÑÑ. Як бÑло Ñказано, Ñе меÑод Ð´Ð»Ñ Ð·Ð°Ð³Ð°Ð»Ñного оÑиÑеннÑ, незалежно вÑд ÑезÑлÑÑаÑÑ.РоÑÑ Ð¿Ñиклад помилки, Ñоб ми могли побаÑиÑи, Ñк вона пеÑедаÑÑÑÑÑ ÑеÑез
finallyдоcatch:new Promise((resolve, reject) => { throw new Error("помилка"); }) .finally(() => alert("ÐÑомÑÑ Ð·Ð°Ð²ÐµÑÑений")) // запÑÑкаÑÑÑÑÑ Ð¿ÐµÑÑим .catch(err => alert(err)); // <-- .catch обÑоблÑÑ Ð¾Ð±âÑÐºÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ -
ФÑнкÑÑÑ-обÑобник
fз.finally(f)Ñакож не повинна нÑÑого повеÑÑаÑи. РнавÑÑÑ ÑкÑо вона ÑоÑÑ Ñ Ð¿Ð¾Ð²ÐµÑÑаÑ, Ñе знаÑÐµÐ½Ð½Ñ Ð²Ñодно бÑде пÑоÑгноÑоване.Ðдиним винÑÑком Ñз ÑÑого пÑавила Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, коли ÑÑнкÑÑÑ-обÑобник
finallyÐ²Ð¸Ð´Ð°Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÑ. Ð ÑакÑй ÑиÑÑаÑÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° пеÑÐµÑ Ð¾Ð´Ð¸ÑÑ Ð´Ð¾ наÑÑÑÐ¿Ð½Ð¾Ñ ÑÑнкÑÑÑ-обÑобника замÑÑÑÑ Ð±ÑдÑ-Ñкого попеÑеднÑого ÑезÑлÑÑаÑÑ Ð¿ÑомÑÑа.
У пÑдÑÑмкÑ:
- ФÑнкÑÑÑ Ð¾Ð±Ñобник
fз.finally(f)не оÑÑимÑÑ ÑезÑлÑÑÐ°Ñ Ð¿Ð¾Ð¿ÐµÑеднÑÐ¾Ñ ÑÑнкÑÑÑ Ð¾Ð±Ñобника (Ñ Ð½Ñого Ð½ÐµÐ¼Ð°Ñ Ð°ÑгÑменÑÑв). ÐамÑÑÑÑ ÑÑого Ñей ÑезÑлÑÑÐ°Ñ Ð¿ÐµÑедаÑÑÑÑÑ Ð½Ð°ÑÑÑÐ¿Ð½Ð¾Ð¼Ñ Ð²ÑдповÑÐ´Ð½Ð¾Ð¼Ñ Ð¾Ð±ÑобникÑ. - ЯкÑо ÑÑнкÑÑÑ Ð¾Ð±Ñобник
fв.finally(f)ÑоÑÑ Ð¿Ð¾Ð²ÐµÑÑаÑ, Ñе знаÑÐµÐ½Ð½Ñ Ð±Ñде пÑоÑгноÑоване. - ЯкÑо Ð²Ð¸Ð½Ð¸ÐºÐ°Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° в
finally, Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð¸ÑÑ Ð´Ð¾ найближÑого обÑобника помилок.
Ð¦Ñ Ð¾ÑобливоÑÑÑ Ñ ÐºÐ¾ÑиÑними й забезпеÑÑÑÑÑ Ð¿ÑавилÑÐ½Ñ ÑобоÑÑ, ÑкÑо ми викоÑиÑÑовÑÑмо finally Ñак, Ñк Ñе пеÑедбаÑено: Ð´Ð»Ñ Ð·Ð°Ð³Ð°Ð»ÑниÑ
пÑоÑедÑÑ Ð¾ÑиÑеннÑ.
ЯкÑо пÑомÑÑ Ð² ÑÑÐ°Ð½Ñ Ð¾ÑÑкÑваннÑ, .then/catch/finally бÑдÑÑÑ Ð½Ð° нÑого ÑекаÑи.
ÐÐ½Ð¾Ð´Ñ Ð¼Ð¾Ð¶Ðµ бÑÑи й Ñаке, Ñо пÑомÑÑ ÑÑане виконаним Ñе до Ñого, Ñк ми додамо до нÑого обÑобник.
У ÑÐ°ÐºÐ¾Ð¼Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ ÑÑ Ð¾Ð±Ñобники пÑоÑÑо запÑÑкаÑÑÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾:
// пÑи ÑÑвоÑÐµÐ½Ð½Ñ Ð¿ÑомÑÑ Ð¾Ð´ÑÐ°Ð·Ñ Ð¶ пеÑейде в ÑÑан ÑÑпÑÑно завеÑÑений (`"resolved"`)
let promise = new Promise(resolve => resolve("завеÑÑено!"));
promise.then(alert); // виведе "завеÑÑено!"
ÐаÑважÑе, Ñо Ñе ÑобиÑÑ Ð¿ÑомÑÑи бÑлÑÑ Ð¿Ð¾ÑÑжними, нÑж жиÑÑÑвий пÑиклад âÑпиÑÐºÑ Ð¿ÑдпиÑокâ. ЯкÑо ÑпÑвак вже випÑÑÑив ÑÐ²Ð¾Ñ Ð¿ÑÑнÑ, а поÑÑм лÑдина пÑдпиÑалаÑÑ, вона ÑмовÑÑно не оÑÑÐ¸Ð¼Ð°Ñ ÑÑ Ð¿ÑÑнÑ. ÐеÑедоплаÑа в ÑеалÑÐ½Ð¾Ð¼Ñ Ð¶Ð¸ÑÑÑ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° бÑÑи здÑйÑÐ½ÐµÐ½Ð¾Ñ Ð´Ð¾ поÑаÑÐºÑ Ð¿Ð¾Ð´ÑÑ.
ÐÑомÑÑи ÑвоÑÑ ÑеÑÐ³Ð¾Ñ Ð±ÑлÑÑ Ð³Ð½ÑÑкÑ. Ðи можемо додаÑи обÑобник в бÑдÑ-Ñкий ÑаÑ: ÑкÑо ÑезÑлÑÑÐ°Ñ Ð²Ð¶Ðµ Ñ, вони пÑоÑÑо виконÑÑÑÑÑÑ.
ÐÑиклад: loadScript
ТепеÑ, ÑозглÑнÑмо декÑлÑка пÑикладÑв з Ñим Ñк пÑомÑÑи можÑÑÑ Ð¾Ð±Ð»ÐµÐ³ÑиÑи нам напиÑÐ°Ð½Ð½Ñ Ð°ÑÐ¸Ð½Ñ Ñонного кодÑ.
Ð Ð½Ð°Ñ Ñ ÑÑнкÑÑÑ loadScript Ð´Ð»Ñ Ð·Ð°Ð²Ð°Ð½ÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑкÑипÑÑ Ð· попеÑеднÑого ÑоздÑлÑ.
Ðгадаймо Ñк виглÑÐ´Ð°Ñ Ð²Ð°ÑÑÐ°Ð½Ñ Ð· колбеком:
function loadScript(src, callback) {
let script = document.createElement('script');
script.src = src;
script.onload = () => callback(null, script);
script.onerror = () => callback(new Error(`Ðомилка заванÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑкÑипÑа ${src}`));
document.head.append(script);
}
Ð¢ÐµÐ¿ÐµÑ Ð¿ÐµÑепиÑемо ÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑавÑи пÑомÑÑ.
ÐовÑй ÑÑнкÑÑÑ loadScript бÑлÑÑе не поÑÑÑбен колбек. ÐамÑÑÑÑ ÑÑого вона бÑде ÑÑвоÑÑваÑи й повеÑÑаÑи обâÑÐºÑ Ð¿ÑомÑÑа, коÑÑий пеÑейде в ÑÑан âÑÑпÑÑно завеÑÑенийâ, коли заванÑÐ°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑÑиÑÑÑÑ. ÐовнÑÑнÑй код Ñакож може додаваÑи обÑобникÑв (âпÑдпиÑникÑвâ) викоÑиÑÑовÑÑÑи .then:
function loadScript(src) {
return new Promise(function(resolve, reject) {
let script = document.createElement('script');
script.src = src;
script.onload = () => resolve(script);
script.onerror = () => reject(new Error(`Ðомилка заванÑÐ°Ð¶ÐµÐ½Ð½Ñ ÑкÑипÑа ${src}`));
document.head.append(script);
});
}
ÐаÑÑоÑÑваннÑ:
let promise = loadScript("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js");
promise.then(
script => alert(`${script.src} заванÑажений!`),
error => alert(`Ðомилка: ${error.message}`)
);
promise.then(script => alert('Ще один обÑобник...'));
ÐдÑÐ°Ð·Ñ Ð¶ помÑÑно декÑлÑка пеÑеваг над викоÑиÑÑÐ°Ð½Ð½Ñ Ð¿ÑÐ´Ñ Ð¾Ð´Ñ Ð· викоÑиÑÑаннÑм колбекÑв:
| ÐÑомÑÑи | Ðолбеки |
|---|---|
ÐÑомÑÑи дозволÑÑÑÑ Ð½Ð°Ð¼ виконÑваÑи ÑеÑÑ Ð² пÑиÑÐ¾Ð´Ð½Ð¾Ð¼Ñ Ð¿Ð¾ÑÑдкÑ. СпоÑаÑÐºÑ Ð¼Ð¸ запÑÑкаÑмо loadScript(script), Ñ Ð¿Ð¾ÑÑм ми пÑопиÑÑÑмо в .then Ñо ÑобиÑи з ÑезÑлÑÑаÑом. |
У Ð½Ð°Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° бÑÑи ÑÑнкÑÑÑ callback на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ loadScript(script, callback). ÐнÑими Ñловами нам поÑÑÑбно знаÑи Ñо ÑобиÑи з ÑезÑлÑÑаÑом до Ñого Ñк виклиÑеÑÑÑÑ loadScript. |
Ðи можемо викликаÑи .then Ñ Ð¿ÑомÑÑа ÑÑÑлÑки Ñаз, ÑкÑлÑки заÑ
оÑемо. Ðожного ÑÐ°Ð·Ñ ÐºÐ¾Ð»Ð¸ ми додаÑмо нового âÑанаÑаâ, Ð½Ð¾Ð²Ñ ÑÑнкÑÑÑ-пÑдпиÑÐºÑ Ð² âÑпиÑок-пÑдпиÑникÑвâ. ÐÑлÑÑе пÑо Ñе в наÑÑÑÐ¿Ð½Ð¾Ð¼Ñ ÑоздÑлÑ: ланÑÑжок пÑомÑÑÑв. |
Ðолбек може бÑÑи ÑÑлÑки один. |
Таким Ñином пÑомÑÑи покÑаÑÑÑÑÑ Ð¿Ð¾ÑÑдок ÐºÐ¾Ð´Ñ Ñ Ð´Ð°ÑÑÑ Ð½Ð°Ð¼ гнÑÑкÑÑÑÑ. Ðле Ñе далеко не вÑе. Ðи дÑзнаÑмоÑÑ Ñе багаÑо коÑиÑного в наÑÑÑÐ¿Ð½Ð¸Ñ ÑоздÑÐ»Ð°Ñ .
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)