Објашњена ЈаваСцрипт обећања

Шта је обећање у ЈаваСцрипт-у?

ЈаваСцрипт је једнонитни, што значи да се два бита скрипте не могу покретати истовремено; морају трчати један за другим. Промисе је објекат који представља евентуални завршетак (или неуспех) асинхроне операције и њену резултујућу вредност.

var promise = new Promise(function(resolve, reject) { // do thing, then… if (/* everything worked */) { resolve("See, it worked!"); } else { reject(Error("It broke")); } });

У једној од ових држава постоји обећање

  • На чекању: почетно стање, нити испуњено нити одбијено.
  • Испуњено: операција је успешно завршена.
  • Одбијено: операција није успела.

Објект Промисе ради као прокси за вредност која није нужно позната када се обећање креира. Омогућава вам да повежете руковаоце са евентуалном вредношћу успеха или разлогом неуспеха асинхроне радње.

Ово омогућава асинхроне методе да враћају вредности попут синхроних метода: уместо да одмах врати коначну вредност, асинхрони метод враћа обећање да ће дати вредност у неком тренутку у будућности.

Коришћење „Тада“ (Промисе Цхаининг)

Да бисте узели неколико асинхроних позива и синхронизовали их један за другим, можете користити ланчано обећање. Ово омогућава коришћење вредности из првог обећања у каснијим следећим повратним позивима.

Promise.resolve('some') .then(function(string) { // <-- This will happen after the above Promise resolves (returning the value 'some') return new Promise(function(resolve, reject) { setTimeout(function() { string += 'thing'; resolve(string); }, 1); }); }) .then(function(string) { // <-- This will happen after the above .then's new Promise resolves console.log(string); // <-- Logs 'something' to the console });

Промисе АПИ

У класи Промисе постоје 4 статичке методе:

  • Промисе.ресолве
  • Промисе.рејецт
  • Промисе.алл
  • Промисе.раце

Обећања се могу повезати ланцима

Када пишете Обећања да бисте решили одређени проблем, можете их повезати у једну логику.

var add = function(x, y) { return new Promise((resolve,reject) => { var sum = x + y; if (sum) { resolve(sum); } else { reject(Error("Could not add the two values!")); } }); }; var subtract = function(x, y) { return new Promise((resolve, reject) => { var sum = x - y; if (sum) { resolve(sum); } else { reject(Error("Could not subtract the two values!")); } }); }; // Starting promise chain add(2,2) .then((added) => { // added = 4 return subtract(added, 3); }) .then((subtracted) => { // subtracted = 1 return add(subtracted, 5); }) .then((added) => { // added = 6 return added * 2; }) .then((result) => { // result = 12 console.log("My result is ", result); }) .catch((err) => { // If any part of the chain is rejected, print the error message. console.log(err); });

Ово је корисно за праћење парадигме функционалног програмирања . Стварањем функција за манипулисање подацима можете их повезати ланцима да бисте прикупили коначни резултат. Ако се у било којој тачки ланца функција одбије нека вредност, ланац ће прескочити на најближи catch()обрађивач.

За више информација о функционалном програмирању: функционално програмирање

Генератори функција

У недавним издањима ЈаваСцрипт је представио више начина за руковање обећањима. Један од таквих начина је генератор функција. Генератори функција су „паусабле“ функције. Када се користе са Промисес, генератори могу много олакшати читање и изгледати „синхроно“.

const myFirstGenerator = function* () { const one = yield 1; const two = yield 2; const three = yield 3; return 'Finished!'; } const gen = myFirstGenerator();

Ево нашег првог генератора, који можете видети по function*синтакси. genПроменљива смо прогласили неће радити myFirstGenerator, већ ће "ово агрегат је спреман да употреби".

console.log(gen.next()); // Returns { value: 1, done: false }

Када покренемо gen.next(), искључит ће генератор и наставити даље. Будући да је ово први пут да га зовемо gen.next(), покренут ће се yield 1и паузирати док gen.next()поново не позовемо . Када yield 1се позове, вратиће нам оно valueшто је дато и да ли је генератор done.

console.log(gen.next()); // Returns { value: 2, done: false } console.log(gen.next()); // Returns { value: 3, done: false } console.log(gen.next()); // Returns { value: 'Finished!', done: true } console.log(gen.next()); // Will throw an error

Како је непрестано зовемо gen.next(), наставит ће сљедећи yieldи сваки пут направити паузу. Једном кад више не yieldостане, он ће покренути остатак генератора, који се у овом случају једноставно враћа 'Finished!'. Ако gen.next()поново позовете , испашће грешка како је генератор завршен.

Сада, замислите да је сваки yieldу овом примеру а Promise, сам код би изгледао изузетно синхроно.

Промисе.алл (итерабле) је врло користан за вишеструки захтев различитим изворима

Метода Промисе.алл (итерабле) враћа једно Промисе које се разрешава када су сва обећања у итерабле аргументу решена или када итерабле аргумент не садржи обећања. Одбија са разлогом првог обећања које одбацује.

var promise1 = Promise.resolve(catSource); var promise2 = Promise.resolve(dogSource); var promise3 = Promise.resolve(cowSource); Promise.all([promise1, promise2, promise3]).then(function(values) { console.log(values); }); // expected output: Array ["catData", "dogData", "cowData"]

Више информација о Обећањима:

  • Како ЈаваСцрипт обећања заправо функционишу
  • Како имплементирати обећања у ЈаваСцрипт
  • Како користити обећања у ЈаваСцрипт-у
  • Како написати ЈавсСцрипт обећање