Нека да видим как можем да създадем 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().