Статические методы конструктора обещаний

#javascript #es6-promise

#javascript #es6-обещание

Вопрос:

Я проверяю статические методы конструктора Promise. Когда я консольно регистрирую свойства конструктора Promise, я вижу методы resolve и reject:

 console.log(Object.getOwnPropertyNames(Promise))
// Array(7) [ "all", "race", "reject", "resolve", "prototype", "length", "name" ]
  

Интересно, являются ли эти методы resolve и reject теми же методами, которые используются в executor в качестве его параметров, или это разные разные вещи:

 const myFirstPromise = new Promise((resolve, reject) => {
//   do something asynchronous which eventually calls either:
//
//   resolve(someValue); // fulfilled
//   or
//   reject("failure reason"); // rejected
});
  

В спецификации упоминаются функции разрешения Promise и Promise.resolve ( x ), которые являются внутренним объектом %Promise_resolve% . Может кто-нибудь сказать мне, это то же самое?

Ответ №1:

Свойства, которые вы видите в выходных console.log() данных, являются свойствами .resolve() и .reject() глобального Promise объекта JavaScript. Вы можете рассматривать их как статические методы класса Promise класса.

Они используются для создания новых Promise объектов, которые уже разрешены / отклонены:

 const p1 = Promise.resolve(3);
console.log(await p1);
// 3
  

Параметры promise и reject , которые вы используете в вызове:

 const myFirstPromise = new Promise((resolve, reject) => {
   if (rand() < 0.5) {
       resolve(3);
   } else {
       reject(new Error('not today'));
   }
});
  

это просто параметры функции. Они могут быть названы так, как вы хотите; они видны только в функции-исполнителе, которую вы передаете в качестве аргумента Promise конструктору.

Они не связаны или не связаны каким-либо образом с Promise.resolve() и Promise.reject() .

Приведенный выше код также может быть записан как:

 const f1 = (resolve, reject) => {
   if (rand() < 0.5) {
       resolve(3);
   } else {
       reject(new Error('not today'));
   }
};

const myFirstPromise = new Promise(f1);
  

Таким образом, становится более понятным, что resolve и reject myFirstPromise Promise никоим образом не связаны ни с каким. Это просто локальные переменные функции f1 .

Комментарии:

1. Это многое объясняет. Я был немного смущен, как сказали спецификации

2. Функция разрешения обещаний — это анонимная встроенная функция, которая имеет [[Promise]] и [[AlreadyResolved]] внутренние слоты.

Ответ №2:

Promise.resolve это ярлык для «взять значение или обещание и вернуть его в виде обещания». myPromise = Promise.resolve("myVal") это более короткий способ

 myPromise = new Promise((resolve) => resolve("myVal"))
  

Promise.reject делает то же самое, только явно отклоняет вместо разрешения.