Нека да видим как можем да създадем Promiseизползвайки неговия конструктор. Създаването на Promiseот нулата е операция от ниско ниво и обикновено се изисква, когато трябва да конвертираме API, който използва друг асинхронен стил (като стил, базиран на обратно извикване). През повечето време ние — като разработчици — сме потребители на обещания, създадени от други библиотеки, и повечето от обещанията, които създаваме, идват от метода then(). Независимо от това, в някои напреднали сценарии трябва ръчно да създадем Promiseс помощта на неговия конструктор.
За да демонстрираме как да използваме конструктора Promise, нека създадем функция, която връща Promise, която се изпълнява с текущата дата след определен брой милисекунди. Нека да го разгледаме:
function delay (milliseconds) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(new Date()) }, milliseconds) }) }
Както вероятно вече се досещате, използвахме setTimeout(), за да извикаме функцията resolve() на конструктора Promise. Можем да забележим как цялото тяло на функцията е обвито от конструктора Promise; това е често срещан модел на код, който ще видите, когато създавате Promiseот нулата.
Функцията delay(), която току-що създадохме, може след това да се използва с някакъв код като следния:
console.log(`Delaying...${new Date().getSeconds()}s`) delay(1000) .then(newDate => { console.log(`Done ${newDate.getSeconds()}s`) })
console.log() в манипулатора на then() ще бъде изпълнен приблизително след 1 секунда от извикването на delay().