Почетак рада са ЈаваСцрипт обећањима
Асинкрони код је корисно за обављање задатака који су дуготрајан али, наравно, то је није лишен контра. Асинц код користи цаллбацк функције да обради његове резултате, међутим, функције повратног позива не може да врати вредности које типичне ЈаваСцрипт функције могу.
Дакле, они не само да одузимају нашу способност да контролишемо извршење функције али и направити Грешка руковање мало гњаваже. Ово је место где Промисе
објекат долази, јер има за циљ да попуни неке од рупе у асинхроном кодирању.
Промисе
је технички а стандардни интерни објект у ЈаваСцрипту, што значи да долази уграђени у ЈаваСцрипт. Користи се за представљање евентуални резултат асинкроног блока кода (или разлог зашто код није успио) и има методе за контролу извршавање асинкроног кода.
Синтакса
Можемо створити инстанца Промисе
објекат помоћу нев
кључна реч:
нев Промисе (функција (разреши, одбаци) );
Функција прошао као параметар до Промисе ()
конструктор је познат као извршилац. Она садржи асинхрони код и има два параметра Фунцтион
тип, који се помиње као решити
и одбити
функције (више о томе ускоро).
Државе Промисе
објекат
Тхе почетно стање оф а Промисе
објекат се зове нерешен. У овом стању, резултат асинхроног израчунавања не постоји.
Почетно стање на чекању се мења на испуњен наведите када је рачунање успешан. Тхе резултат израчунавања је доступан у овом стању.
У случају асинхроног израчунавања фаилс, тхе Промисе
објекат се помера у одбијен стање од почетног нерешен држава. У овом стању разлог неуспеха рачунања (тј. порука о грешци) је доступна.
Да одем нерешен до испуњен држава, разреши ()
се зове. Да одем нерешен до одбијен држава, одбити()
се зове.
Тхе онда
и улов
методе
Када је држава промене од нерешен до испуњен, руковалац догађаја Промисе
објецт'с онда
метода се извршава. И, када држава промене од нерешен до одбијен, руковалац догађаја Промисе
објецт'с улов
метода се извршава.
Пример 1
“Није промовисан” код
Претпоставимо да постоји хелло.ткт
фајл који садржи “Здраво” речи. Ево како можемо да напишемо АЈАКС захтев донеси ту датотеку и приказати његов садржај, без коришћења Промисе
предмет:
фунцтион гетТкт () лет кхр = нев КСМЛХттпРекуест (); кхр.опен ('ГЕТ', 'хелло.ткт'); кхр.оверридеМимеТипе ('тект / плаин'); кхр.сенд (); кхр.онлоад = фунцтион () три свитцх (тхис.статус) цасе 200: доцумент.врите (тхис.респонсе); пауза; цасе 404: баците 'Филе Нот Фоунд'; подразумевано: баците 'Фаилед то фетцх тхе филе'; цатцх (ерр) цонсоле.лог (ерр); гетТкт ();
Ако је садржај датотеке био успешно преузета, тј. шифра статуса одговора је 200, текст одговора је у документ. Ако је датотека није пронађен (статус 404), а “Фајл није пронађен” се појављује порука о грешци. Иначе, а општа порука о грешци што указује на неуспјех пребацивања датотеке.
“Промисифиед” код
Сада, хајде Промовирајте горе наведени код:
фунцтион гетТкт () ретурн нев Промисе (функција (разреши, одбаци) лет кхр = нев КСМЛХттпРекуест (); кхр.опен ('ГЕТ', 'хелло.ткт'); кхр.оверридеМимеТипе ('тект / плаин'); кхр.сенд (); кхр.онлоад = фунцтион () свитцх (тхис.статус) цасе 200: ријешите (тхис.респонсе); цасе 404: одбаците ('Филе Нот Фоунд'); дефаулт: одбијте ('Фаилед то дохвати датотеку ');;); гетТкт (). (функција (ткт) доцумент.врите (ткт);). цатцх (функција (ерр) цонсоле.лог (ерр););
Тхе гетТкт ()
Функција је сада кодирана врати нову инстанцу Промисе
објекат, и његова извршна функција држи асинхрони код од раније.
Када шифра статуса одговора је 200, тхе Промисе
је испуњен од стране зове разреши ()
(одговор се преноси као параметар од разреши ()
). Када је статусни код 404 или неки други, Промисе
је одбијен Користећи одбити()
(уз одговарајућу поруку о грешци као параметар од одбити()
).
Тхе руковаоци догађајима за онда()
и улов()
методе од Промисе
предмет су додано на крају.
Када Промисе
је испуњен, руковалац онда()
метода је покренута. Његов аргумент је параметар је прослеђен разреши ()
. Унутар управљача догађаја, текст одговора (примљен као аргумент) је у документ.
Када Промисе
је одбијен, руковалац догађаја улов()
метода је покренута, записивање грешке.
Тхе главна предност Изнад промовисана верзија кода је Грешка руковање. Уместо да бацамо Необучене Изнимке - као у верзији која није промовисана - одговарајуће поруке о грешкама се враћају и записују.
Али, није само ретурнинг од поруке о грешкама али и резултат асинхроног израчунавања то може бити заиста корисно за нас. Да бисмо то видели, морамо проширити наш пример.
Пример 2
“Није промовисан” код
Уместо да приказујете само текст хелло.ткт
, Желим да комбиновати са “Ворлд” речи и приказати га на екрану након истека времена од 2 секунде. Ево кода који користим:
фунцтион гетТкт () лет кхр = нев КСМЛХттпРекуест (); кхр.опен ('ГЕТ', 'хелло.ткт'); кхр.оверридеМимеТипе ('тект / плаин'); кхр.сенд (); кхр.онлоад = фунцтион () три свитцх (тхис.статус) случај 200: доцумент.врите (цонцатТкт (тхис.респонсе)); пауза; цасе 404: баците 'Филе Нот Фоунд'; подразумевано: баците 'Фаилед то фетцх тхе филе'; цатцх (ерр) цонсоле.лог (ерр); фунцтион цонцатТкт (рес) сетТимеоут (фунцтион () ретурн (рес + 'Ворлд'), 2000); гетТкт ();
На статусном коду 200, цонцатТкт ()
функција је позвана спојите текст одговора са “Ворлд” речи пре писања у документ.
Али, овај код неће радити по жељи. Тхе сетТимеоут ()
цаллбацк фунцтион не може вратити спојени низ. Оно што ће бити одштампано у документу је недефинисан
јер то је Шта цонцатТкт ()
враћа.
“Промисифиед” код
Дакле, да би код функционисао, хајде Промовирајте горе наведени код, укључујући цонцатТкт ()
:
фунцтион гетТкт () ретурн нев Промисе (функција (разреши, одбаци) лет кхр = нев КСМЛХттпРекуест (); кхр.опен ('ГЕТ', 'хелло.ткт'); кхр.оверридеМимеТипе ('тект / плаин'); кхр.сенд (); кхр.онлоад = фунцтион () свитцх (тхис.статус) цасе 200: ријешите (тхис.респонсе); цасе 404: одбаците ('Филе Нот Фоунд'); дефаулт: одбијте ('Фаилед то дохвати датотеку ');;); фунцтион цонцатТкт (ткт) ретурн нев Промисе (функција (разреши, одбаци) сетТимеоут (функција () разреш. (ткт + 'Ворлд');, 2000);); гетТкт (). ((ткт) => ретурн цонцатТкт (ткт);), тада ((ткт) => доцумент.врите (ткт);) цатцх ((ерр) => цонсоле. лог (ерр););
Баш као гетТкт ()
, тхе цонцатТкт ()
функција враћа ново Промисе
објекат уместо спојеног текста. Тхе Промисе
вратио цонцатТкт ()
је решена унутар повратне функције сетТимеоут ()
.
Близу краја горњег кода, руковалац догађаја првог онда()
метода се покреће када Промисе
оф гетТкт ()
је испуњен, тј. када је датотека успео је. Унутар тог водича, цонцатТкт ()
се зове анд тхе Промисе
вратио цонцатТкт ()
се враћа.
Руковалац догађаја другог онда()
метода се покреће када Промисе
вратио цонцатТкт ()
је испуњен, тј 2 секунде је истекао и разреши ()
се зове са повезаним низом као својим параметром.
Коначно, улов()
хвата све изнимке и поруке о грешкама обе обећања.
У овој промовисаној верзији “Здраво Свете” стринг ће бити успешно одштампан на документ.